0

到目前为止,我可以listview通过 String 对事物进行排序ArrayAdapter。但现在我想进步,我希望能够listview按其排序CustomAdapter

到目前为止 ,这是我尝试过的:

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);

    }
} 

数据库助手

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

4

1 回答 1

1

这个答案提供了一个很好的概述:

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

无论哪种情况,在 ArrayList 更改后,您必须调用 notifyDataSetChanged() 以使用更改更新您的 ListView。这可以在适配器内部或外部完成。

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

public void updateData(int[] image, String[] house, String[] price) {
    data_text1 = house;
    data_text2 = price;
    data_image = image;
    notifyDataSetChangeD();
}
于 2013-10-30T10:27:44.783 回答