2011-08-26 30 views
0

我有一個自定義ListView,每個列表項都有四個顯示銀行名稱,金額,日期和時間的TextViews。這些數據存儲在數據庫中。這個想法是,在活動中有一個快速的動作對話框,點擊排序按鈕打開。對話框有三個選項,分別是「按銀行名稱排序」升序排列,「按日期排序」最新的第一個和「按數量排序」的數量較大的列表頂部。我不知道如何繼續將排序任務寫入onItemClick(int pos)中。任何人都可以幫助我嗎?使用ArrayAdapter對ListView進行排序<String>

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

回答

0

您可以使用下面的代碼。您需要將銀行信息維護在BankInfo對象中。創建一個BankInfo對象的ArrayList,然後您可以使用此代碼。將相關信息保存到單獨的數組中並不是一個好習慣。

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

我會給你我這樣做的方式,而不是最好的,但它可以正常工作。

最前一頁所有的user7777777777的說,這是更好地相關的相關信息保存到同一對象,所以我會定義BankInfo類,如下圖所示:

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 
} 
} 

一旦你有了這個,你將定義這個對象的數組BankInfo[] trans。在適配器中,您可以使用此數組將值綁定到視圖中。

然後通過管理來實現排序功能的事情,我會做的是把一個靜態變量爲BankInfo類並重寫CompareTo()方法來使用該字段:

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 
    } 
} 

本的BankInfo裏面你將只需要將您的陣列添加到TreeSet<BankInfo>,並且您的所有項目將使用compareTo()方法進行排序。

適配器把這種方法元素適配器

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(); 
} 
+0

參考comparteTo()API知情權值返回排序裏面。 –

+0

謝謝。但我在快速操作對話框中有一個排序選項。所以當我按下對話框中的第一個項目(銀行名稱)時,根據銀行名稱進行分類並且像明智一樣。所以你可以告訴我什麼,我必須包括在onitemclick(int pos) – shehanaz

+0

與我寫的代碼之前。在 public void onItemClick(int pos) 您必須訪問ListView適配器並執行我在sort_datas(int sort_by)之前傳遞正確值的方法,具體取決於是否單擊了QuickAction。 您需要傳遞在BankInfo類的compareTo中使用的相同值。 –

相關問題