2013-10-30 136 views
0

到目前爲止,我可以通過其字符串ArrayAdapter排序listview事情。但是現在,隨着我想要進步,我希望能夠通過CustomAdapter來排序listviewAndroid CustomAdapter ListView排序

這裏就是我到目前爲止已經試過:

MainActivity

String[] text, price; 
ArrayList<String> priceList; 

private DBHelper dbHelper; 
SimpleCursorAdapter dataAdapter; 
Cursor cursor; 

MyCustomAdapter adapter; 

Button back, filter; 
TextView highest, lowest, location; 

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

    initControls(); 

    displayRecords(); 
} 

private void displayRecords() { 
    // TODO displayRecords 
    // TODO CheckDBConnection 
    checkDatabaseConnection(); 

    text = dbHelper.getAll(); 
    price = dbHelper.getAllPrices(); 

    adapter = new MyCustomAdapter(imgs, text, price); 

    lv.setAdapter(adapter); 

} 

    @SuppressLint("InlinedApi") 
private void displayDialog() { 
    // TODO displayDialog 
    final ArrayAdapter<String> adp = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, sortBy); 

    LayoutInflater li = LayoutInflater.from(this); 
    View promptsView = li.inflate(R.layout.dialog_layout, null); 

    promptsView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 

    final Spinner mSpinner= (Spinner) promptsView 
      .findViewById(R.id.spDialog); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    builder.setTitle("Sort By..."); 
    builder.setIcon(R.drawable.launcher); 

    mSpinner.setAdapter(adp); 
    mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

    public void onItemSelected(AdapterView<?> parent, View v, 
      int pos, long id) { 
     strSpinner = mSpinner.getSelectedItem().toString(); 

     if(strSpinner.equals("Highest Price")){ 
      highest.setTypeface(Typeface.DEFAULT_BOLD); 
      lowest.setTypeface(Typeface.DEFAULT); 
      location.setTypeface(Typeface.DEFAULT); 
      price = dbHelper.sortHighestPrice(); 

      adapter = new MyCustomAdapter(imgs, text, price); 
      lv.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 

     } else if (strSpinner.equals("Lowest Price")){ 
      highest.setTypeface(Typeface.DEFAULT); 
      lowest.setTypeface(Typeface.DEFAULT_BOLD); 
      location.setTypeface(Typeface.DEFAULT); 
      price = dbHelper.sortLowestPrice(); 

      adapter = new MyCustomAdapter(imgs, text, price); 
      lv.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 
     } else if (strSpinner.equals("Location")) { 
      highest.setTypeface(Typeface.DEFAULT); 
      lowest.setTypeface(Typeface.DEFAULT); 
      location.setTypeface(Typeface.DEFAULT_BOLD); 
     } else { 
      Log.d("Default", "Default"); 
     } 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
    }); 

    builder.setPositiveButton("Okay", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.dismiss(); 
     } 
    }); 
    builder.setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.dismiss(); 
     } 
    }); 

    builder.setView(promptsView); 
    AlertDialog alert = builder.create(); 
    alert.show(); 

    //((Button)alert.findViewById(android.R.id.button1)).setBackgroundResource(R.drawable.custom_button); 
    //((Button)alert.findViewById(android.R.id.button2)).setBackgroundResource(R.drawable.custom_button); 
} 

    class MyCustomAdapter extends BaseAdapter 
{ 
    String[] data_text1; 
    String[] data_text2; 
    int[] data_image; 

MyCustomAdapter() { 
    data_text1 = null; 
    data_text2 = null; 
    data_image = null; 
} 

MyCustomAdapter(int[] image, String[] house, String[] price) { 
    data_text1 = house; 
    data_text2 = price; 
    data_image = image; 
} 

public int getCount() { 
    return data_text1.length; 
} 

public String getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = getLayoutInflater(); 
    View row; 

    row = inflater.inflate(R.layout.listrow, null); 

    TextView textview1 = (TextView) row.findViewById(R.id.text1); 
    TextView textview2 = (TextView) row.findViewById(R.id.text2); 
    ImageView imageview = (ImageView) row.findViewById(R.id.image); 

    imageview.setScaleType(ImageView.ScaleType.FIT_XY); 
    textview1.setText(data_text1[position]); 
    textview2.setText(data_text2[position]); 
    imageview.setImageResource(data_image[position]); 

    return (row); 

    } 
} 

DBHelper

public String[] getAll(){ 
      Cursor localCursor = 
        this.myDataBase.query(DB_TABLE, new String[] { 
         KEY_ID, KEY_HOUSE, KEY_PRICE }, null, null, null, null, null); 
      String[] array = new String[localCursor.getCount()]; 
      int i = 0; 
      while(localCursor.moveToNext()){ 
       String uname = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_HOUSE)); 
       array[i] = uname; 
       i++; 
      } 
      return array; 
     } 

     public String[] getAllPrices(){ 
      Cursor localCursor = 
        this.myDataBase.query(DB_TABLE, new String[] { 
         KEY_ID, KEY_HOUSE, KEY_PRICE }, null, null, null, null, null); 
      String[] array = new String[localCursor.getCount()]; 
      int i = 0; 
      while(localCursor.moveToNext()){ 
       String uname = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_PRICE)); 
       array[i] = uname; 
       i++; 
      } 
      return array; 
     } 

     public String[] sortHighestPrice(){ 
      Cursor localCursor = 
        this.myDataBase.query(DB_TABLE, new String[] { 
         KEY_ID, KEY_HOUSE, KEY_PRICE }, 
         null, null, null, null, 
         KEY_PRICE + " DESC"); 
      String[] array = new String[localCursor.getCount()]; 
      int i = 0; 
      while(localCursor.moveToNext()){ 
       String uname = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_PRICE)); 
       array[i] = uname; 
       i++; 
      } 
      return array; 
     } 

     public String[] sortLowestPrice(){ 
      Cursor localCursor = 
        this.myDataBase.query(DB_TABLE, new String[] { 
         KEY_ID, KEY_HOUSE, KEY_PRICE }, 
         null, null, null, null, 
         KEY_PRICE + " ASC"); 
      String[] array = new String[localCursor.getCount()]; 
      int i = 0; 
      while(localCursor.moveToNext()){ 
       String uname = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_PRICE)); 
       array[i] = uname; 
       i++; 
      } 
      return array; 
     } 

基本上,我的應用功能:

  • 它顯示
  • 當用戶點擊過濾器按鈕選擇從最高價格最低的價格和位置,該應用應該通過根據用戶的選擇進行排序響應數據(圖像,標題和字幕)的列表(排序最高,最低或位置)...

因此,這些數據來自本地db(sqlite)

沒有錯誤,到目前爲止,但它只是在列表未更新/排序。我在代碼中錯過了什麼?有任何想法嗎?我真的需要幫助。謝謝。

更新:我得到它的工作,但現在的問題是價格是一個字符串,當我整理由最高的,它給了900,而不是1000我該如何處理呢?

+0

是您從'sortHighestPrice()'和'sortLowestPrice()'正確排序得到的數據? **編輯**:似乎查詢是正確的,所以問題可能是該列表不更新。 –

+0

@JeffreyKlardie我已更新我的代碼,請查看我的更新說明。 – Dunkey

+0

我建議將價格設爲數字字段,例如整數並存儲美分。然後檢索,這使排序更容易。另一種解決方案是將字符串排序爲整數:「CAST(value AS INTEGER)DESK」,其中value是列的名稱。 –

回答

1

This答案給出了一個很好的概述:

兩個選擇:要麼不放,你 傳遞到構造函數的ArrayList的引用,以便您可以修改實際列表數據 後(由於該表ISN不會複製,修改適配器外部的數據仍會更新適配器所引用的指針),或者重寫適配器以允許將列表重置爲另一個對象。

無論哪種情況,ArrayList發生更改後,必須調用 notifyDataSetChanged()以更新您的ListView。這個 可以在適配器內部或外部完成。

在我看來

乾淨的方法是創建一個像updateData()內MyCustonAdapter的方法:

public void updateData(int[] image, String[] house, String[] price) { 
    data_text1 = house; 
    data_text2 = price; 
    data_image = image; 
    notifyDataSetChangeD(); 
}