如何更改数组适配器中包含的textviews中的值

时间:2013-02-01 21:24:43

标签: android android-listview android-arrayadapter

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

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

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

因为我在数组适配器中定义了onClick()方法,所以我有一个包含行v的RowHolder类以及填充列表项的行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;

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

这个实现工作得相当好,只是当我更改实际视图中的值时,最终会为所有可见行更改它。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

将项目和行绑在一起就像这样并不理想。 Android会回收视图,这使得难以保持直观。正如你所发现的那样。我发现视图的settag方法非常方便处理这样的问题。如果视图需要知道与其关联的适配器中的哪个项目,请使用setTag来跟踪它。适配器的getView方法是设置它的理想场所。我会从设计中完全删除支架。尝试将数据与视图绑定的几个地方。

从视图中分离数据并使适配器快速刷新后。您只需要更新数据以及其他所有工作。

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