如果光标具有特定值,则更改 ListView 中的图像

Posted

技术标签:

【中文标题】如果光标具有特定值,则更改 ListView 中的图像【英文标题】:Change Image in ListView if cursor has certain value 【发布时间】:2015-10-17 13:05:29 【问题描述】:

我在谷歌地图上有几个标记,每个标记都有一个包含多个条目的 ListView。用户可以喜欢每个条目,如果他喜欢,SQLite 数据库中会存储一个条目,其中包含标记 ID、条目 ID 以及他是否喜欢 (1) 或取回喜欢 (0)。 现在,我希望在用户喜欢的每个列表项下方显示一颗饱满的心。问题是:特别是如果有很多条目,会有随机填充的心,即使用户只喜欢一个条目。有人能找出我的错误吗?

活动,如果条目被保存,则保存在 SQLite 数据库中:

getALlEntrysListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
                try 
                    JSONObject entryClicked = jsonArray.getJSONObject(position);
                    entryID = entryClicked.getString("id");
                 catch (JSONException e) 
                    e.printStackTrace();
                

                likeButton = (ImageView) view.findViewById(R.id.heartImage);
                pos = "" + position;
                int objectID = Integer.parseInt(entryID);
                Cursor cursor = getLikes(dbh);
                cursor.moveToFirst();

                if (cursor.moveToFirst()) 
                    do 
                        if (Integer.parseInt(cursor.getString(2)) == 1) 
                            dbh.updateLike(dbh, markerID, objectID, Integer.parseInt(cursor.getString(2)), 0);
                            dislike(entryID);
                            cursor.close();
                         else if (Integer.parseInt(cursor.getString(2)) == 0) 
                            dbh.updateLike(dbh, markerID, objectID, Integer.parseInt(cursor.getString(2)), 1);
                            likeUpload(entryID);
                            cursor.close();
                         else 
                            dbh.addLike(dbh, markerID, objectID, 1);
                            likeUpload(entryID);
                            cursor.close();
                        
                     while (cursor.moveToNext());
                 else 
                    dbh.addLike(dbh, markerID, objectID, 1);
                    likeUpload(entryID);
                    cursor.close();
                
            

        
    );

适配器,设置listView的元素,如果条目被点赞,则将图像更改为heart_filled:

 @Override
public View getView(final int position, View convertView, ViewGroup parent) 
    final ListCell cell;
    if (convertView == null) 
        convertView = inflater.inflate(R.layout.pinboard_list_view_cell, null);
        cell = new ListCell();
        cell.likes = (TextView) convertView.findViewById(R.id.listViewLikes);
        cell.note = (TextView) convertView.findViewById(R.id.listViewNote);
        cell.img = (ImageView) convertView.findViewById(R.id.listViewImg);
        cell.likeImage = (ImageView) convertView.findViewById(R.id.heartImage);
        convertView.setTag(cell);
    
    else 
        cell = (ListCell)convertView.getTag();
    
    cell.position = position;


    try 
        JSONObject jsonObject = this.dataArray.getJSONObject(position);
        cell.likes.setText(jsonObject.getString("likes"));
        cell.note.setText(jsonObject.getString("note"));
        cell.entryID = jsonObject.getString("id");
        String img = jsonObject.getString("image");
        String urlForImageInServer = baseUrlForImage + img;

        Picasso.with(context)
            .load(urlForImageInServer)
            .placeholder(R.drawable.progress_animation)
            .error(R.drawable.no_picture)
            .into(cell.img);



        objectID  = ""+cell.entryID;
        dbh = new DbHelper(context);
        cursor = getLikes(dbh);
        cursor.moveToFirst();
        if (cursor.moveToFirst()) 
            do 
                if (Integer.parseInt(cursor.getString(2)) == 1) 
                    cell.likeImage.setImageResource(R.drawable.heart_filled);
                
                else if (Integer.parseInt(cursor.getString(2)) == 0) 
                    cell.likeImage.setImageResource(R.drawable.heart);
                
            
            while(cursor.moveToNext());
        
        else 
            cursor.close();
        
        cursor.close();

    
    catch (JSONException e) 
        e.printStackTrace();
    
    return convertView;



public static class ListCell 
    private TextView likes;
    private TextView note;
    private ImageView img;
    public ImageView likeImage;
    public int position;
    public String entryID;



public Cursor getLikes(DbHelper dbh) 
    dbase = dbh.getReadableDatabase();
    String columns[] = dbh.LIKES_MARKERID, dbh.LIKES_ENTRYID, dbh.LIKES_LIKE;
    String selection = dbh.LIKES_MARKERID + " LIKE ? AND " + dbh.LIKES_ENTRYID + " LIKE ? ";
    String args[] = markerID.toString(), objectID;
    Cursor cursor = dbase.query(dbh.TABLE_LIKES, columns, selection, args , null, null, null, null);
    return cursor;

也许我应该补充一点,SQLite 条目似乎添加正确,因为如果我喜欢一个被错误填充的条目,它不会取消填充它,而是保持填充并增加喜欢的数量。只有这样我才能“不喜欢”它,然后心又是空虚的。

【问题讨论】:

也许是因为我没有经常使用 sql 和 picasso,但是在你的 'doif/else ifwhile(cursor.moveToNext());' 中,我看不到你的单元格发生了变化,所以它似乎会为数据库中的每一个类似的单元格更改相同的单元格? 【参考方案1】:

第一个想法:如果只有 1 表示喜欢,0 表示不喜欢,请将查询更改为 if/else 而不是 if/else if;这是一个可能的错误源更少。

第二个想法更新:关于我在您的帖子下作为评论发布的内容,但对这些内容还没有足够的经验,目前无法做出明确的陈述。

【讨论】:

我试过你的答案,但没有任何改变。它是否必须通过滚动列表来做一些事情?因为举个例子:我喜欢最后一个列表项,然后我向上滚动,后面的下一个条目也充满了心。然后我重新开始活动:除了最后一个条目外,所有的心都没有填满,所以一切似乎都正确,但是当我再次向上滚动时,突然间,第二个项目都有一个填满的心...... 那可能确实和我在你帖子下的评论有关。

以上是关于如果光标具有特定值,则更改 ListView 中的图像的主要内容,如果未能解决你的问题,请参考以下文章

如果类包含值,则更改背景颜色

如果输入具有特定类,则需要更改单选值

SQL 聚合具有相同 id 的行,辅助列中的特定值

如何在 ListView 中正确更改特定行的背景颜色? (安卓)

如果列包含特定值,则更改表格行的颜色

如果列具有特定值,则返回 true