-1

我在这里有一个问题,我将 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;
}
4

1 回答 1

0

该行:

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();
于 2019-08-18T17:55:21.783 回答