gpt4 book ai didi

java - Android ListView : Changes made to Items affect other Items

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:13 24 4
gpt4 key购买 nike

我知道这是使用ListView时经常遇到的问题。但是,我在实现中没有发现任何问题,因为我正确遵循了自定义适配器的 ViewHolder 模式。

问题:

对一项进行的更改(例如,一次性更改 TextView 的文本)会在向下/向上滚动时影响其他随机项。当我向后滚动时,原始项目以及其他项目都会更改。

可以使用 ViewHolder 模式解决此问题。这很奇怪,因为我仍然遇到这个问题!

适配器代码:

public class TrackerAdapter extends BaseAdapter {
private Activity activity;
private static LayoutInflater inflater = null;
ArrayList <Set> sets = new ArrayList <> ();

public TrackerAdapter(Activity a, final ArrayList <Set> sets) {
this.activity = a;
this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.sets = sets;
}

public int getCount() {
return sets.size();
}
public Set getItem(int position) {
return sets.get(position);
}
public long getItemId(int position) {
return position;
}

@Override
public int getViewTypeCount() {
return 1;
}

@Override
public int getItemViewType(int position) {
return position;
}

public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final Set set = sets.get(position);
final Holder holder;
try {
if (view == null) {
view = inflater.inflate(R.layout.row_single, null);
holder = new Holder();
holder.name = (TextView) view.findViewById(R.id.name);
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
}
holder.name.setText(set.getUser().getName());
} catch (Exception ex) {
Log.d("CHECK", "Error at TrackerAdapter");
Log.d("CHECK", Log.getStackTraceString(ex));
}
return view;
}
public static class Holder {
TextView name;
}
}

您在我的代码中发现了什么问题?我是否正确实现了 ViewHolder 模式?

最佳答案

你的代码看起来是正确的,所以我会大胆猜测并说你从外部修改了支持ArrayList。进行更改后,如果不通知 ListView,就无法执行此操作。

以下代码将解耦您的工作数组和显示的数据。

final ArrayList <Set> sets = new ArrayList <> ();

public TrackerAdapter() {
}

public void setItems(ArrayList<Set> sets) {
this.sets.clear();
this.sets.addAll(sets)
notifyDataSetChanged();
}

public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final Set set = sets.get(position);
final Holder holder;

if (view == null) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
view = inflater.inflate(R.layout.row_single, parent, false);
holder = new Holder();
holder.name = (TextView) view.findViewById(R.id.name);
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
}

holder.name.setText(set.getUser().getName());

return view;
}

关于java - Android ListView : Changes made to Items affect other Items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36099052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com