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

Android 如何更改数组适配器中包含的TextView中的值,android,android-listview,android-arrayadapter,Android,Android Listview,Android Arrayadapter,我有一个列表视图,由一个数组适配器按照ViewHolder模式填充。当有人单击某个按钮时,每一行都相当复杂。我想增加该行中显示的计数,并更新该行中的文本字符串 到目前为止,我已经正确地填充了所有内容,但是当我单击一个单元格上的按钮时,如果已经创建了下一行,它也会更改下一行上的值 我尝试了notifyDataSetChanged(),但这会重新填充整个列表,这对我的情况并不理想 因为我在数组适配器中定义了onClick()方法,所以我有一个RowHolder类,它保存行v以及填充列表项的行Main

我有一个列表视图,由一个数组适配器按照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;
单击按钮时,我会更改提供listview的数据中的值以及保存视图的支架中的数据以及实际视图中显示的数据

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

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

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

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

我有一个RowHolder类,它保存第v行以及填充该行的项列表项的MainListItem

class RowHolder{
    View v;
    MainListItem i;
    RowHolder(View v, MainListItem i){
        this.v = v;
        this.i=i;
    }
}
这样将项目和行绑定在一起并不理想。Android会回收视图,这使得它很难保持直线。正如你所发现的。我发现视图的settag方法非常方便处理此类问题。如果视图需要知道适配器中与之关联的项,请使用setTag跟踪该项。适配器的getView方法是设置此选项的最佳位置。我将从设计中完全移除支架。尽量在很少的地方将数据绑定到视图

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


有关更多信息,请阅读Model View Controller设计模式。

因此,我对适配器内的数据所做的任何更改,无论我需要重新加载整个适配器有多小?重新加载适配器时使用错误的术语…您需要告诉适配器其数据已更改。这取决于您的适配器来决定您是否这样做。您的实现可能会进行完全重新加载,但这不是唯一的选择。例如,你可以浏览所有项目,只更新新的/修改过的项目。你在原始文章中的方法没有错,只是需要大量的簿记代码。如果您的视图完全脱离适配器,则可以避免所有同步和簿记代码。我已将所有信息排列好,仅当我设置视图的文本时,它将为所有可见的视图设置文本。notifydatasetchange是否是在不影响已绘制的其他视图的情况下立即更新文本的唯一方法?我最终将我的
onClick()
移动到listactivity类,并获得了更好的结果,感谢您的帮助。