自定义适配器显示具有 SQL 数据库的重复项



我在这里有一个问题,我将 2 家不同咖啡店的名称和费率添加到数据库中,但是当我将它们显示给自定义列表视图时,它完全失败了,列表视图显示 2 列与咖啡店同名,但是当我尝试使用普通 ArrayAdapter 仅显示名称时,这完全很好。我不知道这里出了什么问题。 感谢您的帮助。

我用来检索数据的代码

public ArrayList<UserReview> searchAllReview(String name) {
ArrayList<UserReview> al = new ArrayList<>();
al.clear();
searchQuery = "SELECT  * FROM detail3 where establish= '"+ name+ "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(searchQuery, null);
UserReview userReview = new UserReview();
if (cursor.moveToFirst()) {
do {
userReview.name=cursor.getString(0);
userReview.rate=cursor.getFloat(3);
al.add(userReview);
} while (cursor.moveToNext());
}
return al;
}

这是我点击搜索的时候:

btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list = new ArrayList<>();
db = new UserDBHandling(getApplicationContext());
List<Float> m = db.getRating(estab);
float max = Collections.max(m);
if(radioButtonAll.isChecked()) {
list = db.searchAllReview(estab);
}
else if(radioButtonBest.isChecked()){
list = db.searchBestReview(max, estab);
}
customAdapter = new CustomAdapter(getApplicationContext(), R.layout.custom_user_search , list);
//                aa = new ArrayAdapter(getApplicationContext() , android.R.layout.simple_list_item_1 , list);
listView.setAdapter(customAdapter);
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
index = position;
return false;
}
});

这是自定义适配器:

public class CustomAdapter extends ArrayAdapter {
Context context;
int resource;
List<UserReview> objects;
public CustomAdapter( Context context, int resource,  List objects) {
super(context, resource, objects);
this.context = context;
this.resource=resource;
this.objects=objects;
}

@Override
public View getView(int position,  View convertView,  ViewGroup parent) {
MyElements myElements;
if(convertView ==null){
myElements = new MyElements();
convertView = LayoutInflater.from(context).inflate(resource , parent , false);
myElements.text = convertView.findViewById(R.id.txtViewUser);
myElements.rate=convertView.findViewById(R.id.ratingUser);
}else {
myElements=(MyElements)convertView.getTag();
}
UserReview userReview = objects.get(position);
myElements.text.setText(userReview.name);
myElements.rate.setRating(userReview.rate);
myElements.rate.setClickable(false);
return convertView;
}
public class MyElements{
TextView text;
RatingBar rate;
}

行:

UserReview userReview = new UserReview();

必须位于循环内,因为您希望表的每一行都有一个新对象:

if (cursor.moveToFirst()) {
do {
UserReview userReview = new UserReview();
userReview.name=cursor.getString(0);
userReview.rate=cursor.getFloat(3);
al.add(userReview);
} while (cursor.moveToNext());
}

另外(不相关(使用此方法将参数传递给rawQuery()方法:

searchQuery = "SELECT  * FROM detail3 where establish = ?";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(searchQuery, new String[] {name});

这样,您可以避免查询中sql injection的风险。
return语句之前,不要忘记关闭数据库对象:

cursor.close();
db.close();

最新更新