2015-09-18 110 views
0

好吧,我有一個列表與電影,並有一些圖像,標題,評級,流派和年份在listView中的每一項的一行。現在我試圖按名稱,評分和年份對這些電影進行排序。我按照this tutorial,但我在這裏stucked:如何排序ArrayList降序

@Override 
public void onClick(View view) { 
    if(view.getTag().equals(TAG_SORT_NAME)){ 
     adapter.getItem(); 
    } 

    if(view.getTag().equals(TAG_SORT_RATING)){ 

    } 

    if(view.getTag().equals(TAG_SORT_YEAR)){ 

    } 

} 

我不知道我應該怎麼通過那裏的getItem並在他的教程中,他用碎片,我不是。這裏是我的活動:

public class ListaPreporuka extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener 
, SortListener{ 

    // Log tag 
    private static final String TAG = ListaPreporuka.class.getSimpleName(); 

    // Movies json url 
    private static final String url = "http://www.nadji-ekipu.org/wp-content/uploads/2015/07/movies.txt"; 
    private ProgressDialog pDialog; 
    private List<Movie> movieList = new ArrayList<Movie>(); 
    private ListView listView; 
    private SwipeRefreshLayout swipeRefreshLayout; 
    private CustomListAdapter adapter; 
    private static final String TAG_SORT_NAME = "sortName"; 
    private static final String TAG_SORT_RATING = "sortRating"; 
    private static final String TAG_SORT_YEAR = "sortYear"; 
    private static String Year = "year"; 
    private static String Rating = "rating"; 
    private static String Title = "title"; 
    private static String bitmap = "thumbnailUrl"; 
    private static String opis = "opis"; 
    private static String urlMovie = "url"; 
    private MediaPlayer mp_off; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.lista_preporuka); 

     // Toolbabr settings 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayUseLogoEnabled(true); 
     getSupportActionBar().setLogo(R.drawable.ic_horor_filmovi_ikonica); 

     Intent newActivity2=new Intent(); 
     setResult(RESULT_OK, newActivity2); 

     mp_off = MediaPlayer.create(this, R.raw.button_click_off); 
     final MediaPlayer mp_on = MediaPlayer.create(this, R.raw.button_click_on); 

     pDialog = new ProgressDialog(this); 
     // Showing progress dialog before making http request 
     pDialog.setIcon(R.drawable.ic_horor_filmovi_ikonica); 
     pDialog.setMessage("Učitavanje..."); 
     pDialog.setCancelable(false); 
     pDialog.show(); 

     listView = (ListView) findViewById(R.id.list); 
     swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); 
     adapter = new CustomListAdapter(this, movieList); 
     listView.setAdapter(adapter); 

     swipeRefreshLayout.setOnRefreshListener(this); 

     /** 
     * Showing Swipe Refresh animation on activity create 
     * As animation won't start on onCreate, post runnable is used 
     */ 
     swipeRefreshLayout.post(new Runnable() { 
            @Override 
            public void run() { 
             swipeRefreshLayout.setRefreshing(true); 
             fetchMovies(); 
            } 
           } 
     ); 

     if (AppStatus.getInstance(this).isOnline()) { 

      Log.v("Home", "############################You are online!!!!"); 

     } else { 
      setContentView(R.layout.no_connection); 
      Toast t = Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT); 
      t.show(); 
      Log.v("Home", "############################You are not online!!!!");  
     } 


     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       String name = ((TextView) view.findViewById(R.id.title)) 
         .getText().toString(); 

       String opisFilma = ((TextView) view.findViewById(R.id.opis)) 
         .getText().toString(); 

       String urlFilm = ((TextView) view.findViewById(R.id.url)) 
         .getText().toString(); 

       String ocena = String.valueOf(movieList.get(position).getRating()); 

       String godina = String.valueOf(movieList.get(position).getYear()); 

       bitmap = ((Movie) movieList.get(position)).getThumbnailUrl(); 

       Intent intent = new Intent(ListaPreporuka.this, MoviesSingleActivity.class); 
       intent.putExtra(Title, name); 
       intent.putExtra(opis, opisFilma); 
       intent.putExtra("images", bitmap); 
       intent.putExtra(Rating, ocena); 
       intent.putExtra(Year, godina); 
       intent.putExtra(urlMovie, urlFilm); 
       mp_on.start(); 
       startActivity(intent); 
       overridePendingTransition(R.anim.slide_in, R.anim.slide_out); 
      } 
     }); 

     buildFAB(); 

    } 

    private void buildFAB(){ 
     // Declare icon for FAB 
     ImageView icon = new ImageView(this); 
     icon.setImageResource(R.drawable.ic_halloween); 

     // Build FAB 
     FloatingActionButton actionButton = new FloatingActionButton.Builder(this) 
       .setContentView(icon) 
       .build(); 

     // Declare icons for SubAction Buttons 
     ImageView iconSortName = new ImageView(this); 
     iconSortName.setImageResource(R.drawable.ic_halloween); 
     ImageView iconSortRating = new ImageView(this); 
     iconSortRating.setImageResource(R.drawable.ic_halloween); 
     ImageView iconSortYear = new ImageView(this); 
     iconSortYear.setImageResource(R.drawable.ic_halloween); 

     // Set the background for all Sub buttons 
     SubActionButton.Builder itemBuilder = new SubActionButton.Builder(this); 

     // Build the Sub Buttons 
     SubActionButton buttonSortName = itemBuilder.setContentView(iconSortName).build(); 
     SubActionButton buttonSortRating = itemBuilder.setContentView(iconSortRating).build(); 
     SubActionButton buttonSortYear = itemBuilder.setContentView(iconSortYear).build(); 
     buttonSortName.setTag(TAG_SORT_NAME); 
     buttonSortRating.setTag(TAG_SORT_RATING); 
     buttonSortYear.setTag(TAG_SORT_YEAR); 
     buttonSortName.setOnClickListener(this); 
     buttonSortRating.setOnClickListener(this); 
     buttonSortYear.setOnClickListener(this); 

     // add the sub buttons to the main floating action button 
     FloatingActionMenu actionMenu = new FloatingActionMenu.Builder(this) 
       .addSubActionView(buttonSortName) 
       .addSubActionView(buttonSortRating) 
       .addSubActionView(buttonSortYear) 
       .attachTo(actionButton) 
       .build(); 
    } 

    @Override 
    public void onRefresh() { 
     fetchMovies(); 

    } 

    private void fetchMovies(){ 

     // showing refresh animation before making http call 
     swipeRefreshLayout.setRefreshing(true); 
     // Creating volley request obj 
     JsonArrayRequest movieReq = new JsonArrayRequest(url, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, response.toString()); 
         hidePDialog(); 
         movieList.clear(); 
         // Parsing json 
         for (int i = 0; i < response.length(); i++) { 
          try { 

           JSONObject obj = response.getJSONObject(i); 
           Movie movie = new Movie(); 
           movie.setTitle(obj.getString("title")); 
           movie.setOpis(obj.getString("opis")); 
           movie.setThumbnailUrl(obj.getString("image")); 
           movie.setRating(((Number) obj.get("rating")) 
             .doubleValue()); 
           movie.setYear(obj.getInt("releaseYear")); 
           movie.setUrl(obj.getString("url")); 

           // Genre is json array 
           final JSONArray genreArry = obj.getJSONArray("genre"); 
           ArrayList<String> genre = new ArrayList<String>(); 
           for (int j = 0; j < genreArry.length(); j++) { 
            genre.add((String) genreArry.get(j)); 
           } 
           movie.setGenre(genre); 

           // adding movie to movies array 
           movieList.add(movie); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          }       

         } 
           adapter.notifyDataSetChanged();         
           // stopping swipe refresh 
           swipeRefreshLayout.setRefreshing(false); 
        } 


       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d(TAG, "Error: " + error.getMessage()); 
         hidePDialog(); 

         // stopping swipe refresh 
         swipeRefreshLayout.setRefreshing(false); 
        } 
       }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(movieReq); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     hidePDialog(); 
    } 

    private void hidePDialog() { 
     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     if (item.getItemId() == android.R.id.home) { 
      finish(); 
      mp_off.start(); 
      overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public void onBackPressed() { 

     super.onBackPressed(); 
     mp_off.start(); 
     overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
    } 

    @Override 
    public void onClick(View view) { 
     if(view.getTag().equals(TAG_SORT_NAME)){ 
      adapter.getItem(); 
     } 

     if(view.getTag().equals(TAG_SORT_RATING)){ 

     } 

     if(view.getTag().equals(TAG_SORT_YEAR)){ 

     } 

    } 

    @Override 
    public void onSortByName() { 

    } 

    @Override 
    public void onSortByRating() { 

    } 

    @Override 
    public void onSortByYear() { 

    } 
} 

回答

2

你應該排序您movieList,假設影片包含流派字符串字段,下面是一些簡單的例子對它進行排序:

Comparator<Movie> comparator = new Comparator<Movie>() { 
    @Override 
    public int compare(Movie movie, Movie t1) { 
    return movie.genre.compareTo(t1.genre); 
    } 
}; 

// ordered by genre 
Collections.sort(movieList, comparator);  

// Reverse order by genre 
Collections.sort(movieList, Collections.reverseOrder(comparator)); 
+1

或者你可以通過定義一個「反向」比較切換比較對象:'return t1.genre.compareTo(movie.genre);' - 這樣你根本不需要'Collections.reverseOrder'。 –

+0

另外我忘了說我需要在這個浮動操作按鈕中實現所有這些。其實在子動作按鈕,我應該通過onClick方法。 –

+0

@DusanDimitrijevic好,然後把你的排序代碼到ie。 'public void onSortByName(){',用'name'字段進行排序。它在UI線程中調用,所以它是安全的。不要忘記在排序後在適配器上調用notifydatasetchanged。 – marcinj