Qube
Qube

Reputation: 573

How to make sort in custom ListView ArrayList and how to make it work in Spinner?

I have custom ArrayList and I want to sort it Descending and Ascending Order with Spinner or Button or anything else.

I have this in my ArrayList:

reports = new ArrayList<Word>();

reports.add(new Word("AC", "Rektorat", "1101", "3 hari", R.drawable.ac, "AC tidak dingin sama sekali"));
reports.add(new Word("Papan Tulis", "Griya Legita","2502", "5 hari", R.drawable.papantulis, "terdapat noda yang tidak bisa hilang"));
reports.add(new Word("Meja", "Griya Legita","2304", "10 hari", R.drawable.meja, "Berdiri tidak seimbang karena kaki patah"));
reports.add(new Word("Kursi", "Griya Legita","2302", "15 hari", R.drawable.kursi, "senderan patah sebanyak 20 buah"));
reports.add(new Word("Atap", "Griya Legita","2807", "21 hari", R.drawable.atap, "bolong terkena lemparan sepatu"));
reports.add(new Word("Lampu", "Griya Legita","Perpustakaan", "30 hari", R.drawable.lampu, "mati 2 buah"));
reports.add(new Word("Sofa", "Griya Legita","Lobby", "43 hari", R.drawable.sofa, "ketumpahan obat nyamuk"));

CardView rootView = (CardView) findViewById(R.id.root_view);

WordAdapter adapter = new WordAdapter(this, reports, R.color.colorPrimary);
listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        Serializable data = (Word) listView.getItemAtPosition(position);
        Intent intent = new Intent (listView.getContext(), LokasiActivity.class);
        intent.putExtra("report", data);
        listView.getContext().startActivity(intent);
    }
});

Word

public class Word implements Serializable {
    private String mAset, mTempat, mRuang, mTanggal, mKomentar;
    int mGambar;

    public Word (String aset, String tempat, String ruang, String tanggal, int gambar, String komentar) {
        mAset = aset;
        mTempat = tempat;
        mRuang = ruang;
        mTanggal = tanggal;
        mGambar = gambar;
        mKomentar = komentar;
    }

    public String getAset() {
        return mAset;
    }

    public String getTempat() {
        return mTempat;
    }

    public String getRuang() {
        return mRuang;
    }

    public String getTanggal() {
        return mTanggal;
    }

    public String getKomentar() {
        return mKomentar;
    }

    public int getGambar() {
        return mGambar;
    }

    public void setGambar(int mGambar){
        this.mGambar = mGambar;
    }

    public String toString() {
        return mAset + " " + mTempat + " " + mRuang + " " + mTanggal + " " + mGambar ;
    }
}

I want to sort it but don't know how because it's custom. Please help

and i try to put it on spinner but doesn't work

public void addItemOnSpinner(){

        spn = (Spinner) findViewById(R.id.spinner);
        List<String> list = new ArrayList<String>();
        list.add("Sort By");
        list.add("Descending");
        list.add("Ascending");
        spn.setOnItemSelectedListener(this);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spn.setAdapter(dataAdapter);

    }
@Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        if ( spn.getSelectedItem().toString().trim().equals("Descending")) {
            Collections.sort(reports, new Comparator<Word>() {
                @Override
                public int compare(Word o1, Word o2) {
                    return o2.getAset().compareTo(o1.getAset());
                }
            });

        }
        else{

        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }

Upvotes: 1

Views: 336

Answers (4)

Fakhriddin Abdullaev
Fakhriddin Abdullaev

Reputation: 4920

Use Comparator like below:

Collections.sort(reports, new CustomComparator());

this is your CustomComparator class:

public class CustomComparator implements Comparator<Case> {

    @Override
    public int compare(Case o1, Case o2) {

        return o1.getContent().compareTo(o2.getContent());

    }
}

Upvotes: 0

Tung Tran
Tung Tran

Reputation: 2955

Try this:
Descending:

Collections.sort(reports, new Comparator<Word>() {
    @Override
    public int compare(Word o1, Word o2) {
        return o2.getAset().compareTo(o1.getAset());
    }
});

Ascending:

Collections.sort(reports, new Comparator<Word>() {
    @Override
    public int compare(Word o1, Word o2) {
        return o1.getAset().compareTo(o2.getAset());
    }
});

And then update list:

if ( spn.getSelectedItem().toString().trim().equals("Descending")) {
        Collections.sort(reports, new Comparator<Word>() {
            @Override
            public int compare(Word o1, Word o2) {
                return o2.getAset().compareTo(o1.getAset());
            }
        });

    }

((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();

Upvotes: 0

sagar
sagar

Reputation: 86

If you want to sort by name:

Collections.sort(atlastContacts, new Comparator<AtlasContact>(){
    @Override
    public int compare(AtlasContact a1, AtlasContact a2) {
        return a1.getName().compareToIgnoreCase(a2.getName());
    }
});

Upvotes: 0

mel
mel

Reputation: 199

You can implement Comparable<T> interface in Word.class than override compareTo() method.

interface Comparable<T> { int compareTo(T obj) }

or implement Comparator<T> interface

interface Comparator<T> { int compare(T obj1, T obj2); }

than override compare() method.

See javadoc. I hope its can help you.

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

Upvotes: 1

Related Questions