2

我有一个按照 ViewHolder 模式由数组适配器填充的列表视图。当有人单击按钮时,每一行都相当复杂,我想增加该行中显示的计数并更新该行中的文本字符串。

到目前为止,我已经正确填充了所有内容,但是当我单击一个单元格上的按钮时,它也会更改下一行的值(如果已创建)。

我已经尝试过notifyDataSetChanged(),但这会重新填充整个列表,这对我的情况并不理想。

因为我onClick()在数组适配器中定义我的方法,所以我有一个 RowHolder 类,它保存行v以及填充MainListItem列表项的该行的项。

class RowHolder{
    View v;
    MainListItem i;
    RowHolder(View v, MainListItem i){
        this.v = v;
        this.i=i;
    }
}

这是按钮的片段,onClick()其中 h 是持有人

    h.loveButton.setBackgroundColor(Color.parseColor(rowHolder.i.brandLoveColor));
    h.loveButton.setImageResource(R.drawable.lovewhite);
    ((ImageView)rowHolder.v.findViewById(R.id.lovebutton)).setImageResource(R.drawable.lovewhite);              
    rowHolder.v.findViewById(R.id.lovebutton).setBackgroundColor(Color.parseColor(rowHolder.i.brandLoveColor));
    String newLovers = getLoverString(rowHolder.i,rowHolder);
    h.lovers.setText(newLovers);
    ((TextView)rowHolder.v.findViewById(R.id.lovers)).setText(newLovers);
    rowHolder.i.loverString = newLovers;
    rowHolder.i.loved = true;
    int tmp = rowHolder.i.loves
    tmp = tmp + 1;
    ((TextView)rowHolder.v.findViewById(R.id.lovecount)).setText(String.valueOf(tmp));
    h.lovecount.setText(String.valueOf(tmp));
    rowHolder.i.loves = tmp;

单击按钮时,我会更改提供列表视图的数据中的值以及持有视图的持有者中的数据以及实际视图中显示的数据。

这个实现工作得很好,除了当我改变实际视图中的值时,它最终会改变所有可见行的值。

如果有人可以帮助我找出更好的方法来实现这一点,那就太好了。

4

1 回答 1

1

我试过 notifyDataSetChanged() 但这会重新填充整个列表,这对我的情况并不理想。

这是您需要解决的一个问题。视图仅显示数据。您可以实现一个快速刷新数据的适配器。例如,如果您加载位图,然后缓存它们以备后用。当然第一次加载可能需要一些时间,但第二次可能是即时的。

我有一个 RowHolder 类,它包含行 v 以及填充列表项的 MainListItem 行的项。

像这样将项目和行捆绑在一起并不理想。Android 会回收视图,这使得这很难保持直截了当。正如你所发现的。我发现视图的 settag 方法对于处理此类问题非常方便。如果视图需要知道适配器中与它关联的项,请使用 setTag 来跟踪它。适配器的 getView 方法是设置它的理想场所。我会从设计中完全移除支架。尽量少有数据与视图相关联的地方。

一旦您将数据与视图分离并使适配器快速刷新。您只需要更新数据,其他一切都可以正常工作。

有关更多信息,请阅读模型-视图-控制器设计模式。

于 2013-02-02T03:28:22.543 回答