开发者

Sorting a ListView with ArrayAdapter<String>

I have a custom ListView, each list item has four TextViews showing bank name, amount, date and time. This data is stored in a database. The idea is that on the Activity there is a quick action dialog which opens on clicking the sort button. The Dialog has three options as "Sort by bank name" ascending order, "Sort by Date" newest first and "Sort by amount" larger amount in the top of the list. I don't have any idea of how to proceed with the sorting task to be written in onItemClick(int pos). Can anyone please help me on this?

public class TransactionMenu extends Activity implements OnItemClickListener, OnActionItemClickListener {
    String[] TransId ;
    String[] mBankName;
    String[] mAmount;
    String[] mDate;
    String[] mTime;
    Button SortButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.transaction_screen);

        SortButton = (Button)findViewById(R.id.sortKey);

        //Bank Name action item
        ActionItem bName = new ActionItem();

        bName.setTitle("Bank Name");
        bName.setIcon(getResources().getDrawable(R.drawable.bank_256));

        //Amount action item
        ActionItem amt = new ActionItem();

        amt.setTitle("Amount");
        amt.setIcon(getResources().getDrawable(R.drawable.cash));

        //date action item
        ActionItem date = new ActionItem();

        date.setTitle("Date");
        date.setIcon(getResources().getDrawable(R.drawable.calender));

        //create quickaction
        final QuickAction quickAction = new QuickAction(this);

        quickAction.addActionItem(bName);
        quickAction.addActionItem(amt);
        quickAction.addActionItem(date);

        quickAction.setOnActionItemClickListener(this);

        SortButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                quickAction.show(v);
                //quickAction.setAnimStyle(QuickAction.ANIM_REFLECT);
            }
        });

        DBAdapter lDBAdapter = new DBAdapter(this);
        lDBAdapter.open();

        /* getTransDetails() returns all the detials stored in the transaction table*/      
        Cursor mCursor =lDBAdapter.getAllTransDetails();
        System.out.println("cur..........."+mCursor);
        lDBAdapter.close();
        if (mCursor != null) {
            int size = mCursor.getCount();
            if (mCursor.moveToFirst()) {
                TransId = new String[size];
                mAmount = new String[size];
                mBankName = new String[size];
                mDate = new String[size];
                mTime = new String[size];

                for (int i = 0; i < size; i++, mCursor.moveToNext())开发者_如何学C {
                    TransId[i] = mCursor.getString(0);
                    mAmount[i] = mCursor.getString(1);
                    mBankName[i] = mCursor.getString(3);
                    mDate[i] = mCursor.getString(2);
                    mTime[i] = mCursor.getString(4);
                }
            }
        }
        for (int i = 0; i < mCursor.getCount(); i++) {
            System.out.println("TransId is+++++++++++++++ "+TransId[i]);
            System.out.println("amount is+++++++++++++++ "+mAmount[i]);
            System.out.println("bankName is+++++++++++++++ "+mBankName[i]);
            System.out.println("date is+++++++++++++++ "+mDate[i]);
            System.out.println("time is+++++++++++++++ "+mTime[i]);
        }

        ListView myListView = (ListView) findViewById(R.id.transactionListView);
        MyBaseAdapter myAdapterObj = new MyBaseAdapter(TransactionMenu.this, R.layout.list_item, TransId);
        myListView.setAdapter(myAdapterObj);
        myListView.setOnItemClickListener((OnItemClickListener) this);
    }

    private class MyBaseAdapter extends ArrayAdapter<String>  {
        public MyBaseAdapter(Context context, int textViewResourceId, String[] transId) {
            super(context, textViewResourceId, transId);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = getLayoutInflater();
            View row = inflater.inflate(R.layout.list_item, parent, false);
            TextView label = (TextView)row.findViewById(R.id.textview1);
            label.setText("Amount:  "+mAmount[position]);
            TextView label1 = (TextView) row.findViewById(R.id.textview2);
            label1.setText("Bank Name:  "+mBankName[position]);
            TextView label2 = (TextView) row.findViewById(R.id.textview3);
            label2.setText("Date:  "+mDate[position]);
            TextView label3 = (TextView) row.findViewById(R.id.textview4);
            label3.setText("Time: "+mTime[position]);
            return row;
        }
    }

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        System.out.println("arg2 is++++++++++++++"+arg2);
        int lRowId = Integer.parseInt(TransId[arg2]);
    }

    public  void onItemClick(int pos) {
        MyBaseAdapter myAdapterObj = new MyBaseAdapter(TransactionMenu.this, R.layout.list_item, TransId);
        if (pos == 0) {
            Toast.makeText(TransactionMenu.this, "Bank name item selected", Toast.LENGTH_SHORT).show();
        } 
        else if (pos ==1) {
            Toast.makeText(TransactionMenu.this, "amount item selected", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(TransactionMenu.this, "Date item selected", Toast.LENGTH_SHORT).show();
        }
    }
}


I will give you the way i would do this, not the best probably but it will work fine.

Fisrt of all as user7777777777 said it's better to keep related infos into the same object so i'd define BankInfo class as shown below:

private class BankInfo{

String TransId ;
String mBankName;
String mAmount;
String mDate;
String mTime;

public BankInfo(String TransId,String mBankName,String mAmount,String mDate,String mTime)
{
    //fields init
}
}

once you have this you will define an Array of this object BankInfo[] trans. In the adapter you can use this array to bind values into views.

then to manage to implement the sorting function the thing i would do is to put a static variable into the BankInfo class and override the CompareTo() method to use that field:

static int AMMOUNT = 0;
static int DATE = 1;
static int NAME = 2;
static public int sort_by;

public int compareTo(BankInfo info){
      switch (sorty_by){
                case(AMMOUNT):
                       return //compare by ammount

                case(DATE):
                       return //compare by date

                case(NAME):
                       return //compare by name  
    }
}

with this inside of BankInfo you will have only to add your array to a TreeSet<BankInfo> and all your item will be sortet using the compareTo() method.

Inside the adapter put this method to sort elements in the adapter

public void sort_datas(int sort_by);
{

     //set the type of sort you want
     BankInfo.sortBy = sort_by;

     //build a Sorted treeSet by the BankInfo array
     TreeSet<BankInfo> sorted_info = new TreeSet<BankInfo>();
     list.addAll(Arrays.asList(trans));

     //replace the BankInfo array with the new sorted one
     trans = (BankInfo[])sorted_info.toArray();

     //notify to the adapter that the data set changed
     notifyDataSetChanged();
}


You can use the following code. You need to maintain the bank info in a BankInfo object. Create an ArrayList of BankInfo objects and then you can use this code. Its not a good practice to keep related info into separate arrays.

Collections.sort(mBankInfoArrayList, new Comparator<BankInfo>() {
      int compare(BankInfo obj1, BankInfo obj2) {
            return obj1.getBankName().compareToIgnoreCase(obj2.getBankName());
      }
});
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜