0

Ok i have one list with movies and there i have some image, title, ratings, genres and year in one row for every item in listView. And now i'm trying to sort these movies by name, rating and year. I have followed this tutorial, but i have stucked here:

@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)){

    }

}

I don't know what should i passed there for getItem and in his tutorial he is using fragments and i'm not. Here is my activity:

    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() {

    }
}

1 Answer 1

3

You should sort your movieList, assuming Movie contains genre String field, below is some quick example to sort it:

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));
Sign up to request clarification or add additional context in comments.

5 Comments

Or you could define a "reverse" comparator by switching the compared objects: return t1.genre.compareTo(movie.genre); - with this you wouldn't need Collections.reverseOrder at all.
Also i forgot to say that i need to implement all this in this floating action button. Actually on sub action buttons and what should i passed there in onClick method.
@DusanDimitrijevic well, then put your sorting code into ie. public void onSortByName() {, with sorting by name field. It is called on UI thread so it is safe. Dont forget to call notifydatasetchanged on adapter after sorting.
Okey, i have done that, but still i don't know what should i add in onClick method. This onClick method is reffering to sub action menu buttons.
@DusanDimitrijevic I am not quite sure if I understand, onClick is called by framework when button is clicked, so If I understand correctly you should call inside onClick one of your onSortByName/onSortByRating/onSortByYear functions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.