Android自定义适配器ListView排序

时间:2013-10-30 10:18:22

标签: android listview

到目前为止,我可以通过字符串listviewArrayAdapter事物进行排序。但是现在我想要进步,我希望能够按listviewCustomAdapter进行排序。

这是我迄今为止尝试的内容:

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.我该如何处理?

1 个答案:

答案 0 :(得分:1)

This回答给出了一个很好的概述:

  

两个选项:要么保留您的ArrayList的引用   传递给构造函数,以便您可以修改实际的列表数据   之后(因为列表没有被复制,修改了数据之外的数据   适配器仍然更新适配器引用的指针),或   重写适配器以允许将列表重置为另一个对象。

     

在任何一种情况下,在ArrayList更改后,您必须调用   notifyDataSetChanged()用更改来更新ListView。这个   可以在适配器内部或外部完成。

我认为最干净的方法是在MyCustonAdapter中创建一个类似updateData()的方法:

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