【发布时间】:2013-10-30 10:18:22
【问题描述】:
到目前为止,我可以通过字符串 ArrayAdapter 对 listview 事物进行排序。但现在我想进步,我希望能够通过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。我该如何处理?
【问题讨论】:
-
您从
sortHighestPrice()和sortLowestPrice()获得的数据是否正确排序? 编辑:似乎查询是正确的,所以问题可能是列表没有更新。 -
@JeffreyKlardie 我已经更新了我的代码,请查看我的更新说明。
-
我建议将价格设为数字字段,例如一个整数并存储美分。然后检索它,这使得排序更容易。另一种解决方案是将字符串排序为整数:
CAST(value AS INTEGER) DESK,其中 value 是列的名称。 -
是的,我把它改成了数字
-
@JeffreyKlardie 谢谢我接受了下面的答案。