gpt4 book ai didi

android - 为什么 getView 在 SeparatedListAdapter 上返回错误的 convertView 对象?

转载 作者:可可西里 更新时间:2023-11-01 19:01:40 25 4
gpt4 key购买 nike

我根据我的需要改编了 Jeff Sharkey 的 SeparatedListAdapter 并得到了这样的东西:

public class SeparatedListAdapter<T> extends BaseAdapter {

@SuppressWarnings("unused")
private final String LOG_TAG = getClass().getSimpleName();

public final static int TYPE_SECTION_HEADER = 0;

public final Map<T, Adapter> sectionAdapters;
public final ArrayAdapter<T> headerAdapter;

public SeparatedListAdapter(ArrayAdapter<T> headerAdapter) {
super();
this.sectionAdapters = new LinkedHashMap<T,Adapter>();
this.headerAdapter = headerAdapter;
}

public void addSection(T section, Adapter adapter) {
this.headerAdapter.add(section);
this.sectionAdapters.put(section, adapter);
}

public void clearSections() {
this.headerAdapter.clear();
this.sectionAdapters.clear();
}

@Override
public int getCount() {
// total together all sections, plus one for each section header
int total = 0;
for(Adapter adapter : this.sectionAdapters.values())
total += adapter.getCount() + 1;
return total;
}

@Override
public int getViewTypeCount() {
//count headers, then total all sections
int total = this.headerAdapter.getViewTypeCount();
for(Adapter adapter : this.sectionAdapters.values())
total += adapter.getViewTypeCount();
return total;
}

@Override
public int getItemViewType(int position) {
int type = 1;
for(Object section : this.sectionAdapters.keySet()) {
Adapter adapter = sectionAdapters.get(section);
int size = adapter.getCount() + 1;

// check if position inside this section
if(position == 0) return TYPE_SECTION_HEADER;
if(position < size) return type + adapter.getItemViewType(position - 1);

// otherwise jump into next section
position -= size;
type += adapter.getViewTypeCount();

}
return -1;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
int sectionnum = 0;
for(Object section : this.sectionAdapters.keySet()) {
Adapter adapter = sectionAdapters.get(section);
int size = adapter.getCount() + 1;

// check if position inside this section
if(position == 0)
return headerAdapter.getView(sectionnum, convertView, parent);
if(position < size)
return adapter.getView(position - 1, convertView, parent);

// otherwise jump into next section
position -= size;
sectionnum++;
}
return null;
}

@Override
public boolean areAllItemsEnabled() {
return false;
}

@Override
public boolean isEnabled(int position) {
return (getItemViewType(position) != TYPE_SECTION_HEADER);
}
}

我遇到的问题是 API 将 onvertView 对象从错误的适配器提供给 getView(),从而导致出现问题。我认为我正确地实现了 getViewTypeCount() 和 getItemViewType() 并使用调试器进行了检查。还有什么可能出错?

这是我的一个适配器:

public static class MeetingAdapter extends ArrayAdapter<Meeting> {
static class ViewHolder {
TextView title;
}
private LayoutInflater inflater;

public MeetingAdapter(Activity context, List<Meeting> meetings) {
super(context, 0, meetings);
this.inflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Meeting meeting = getItem(position);

View rowView = convertView;
ViewHolder holder;

// instanceof should not be necessary!!! normally convertView should be of the right type!
if (rowView == null || !(rowView.getTag() instanceof ViewHolder)) {
rowView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.title = (TextView)rowView; // tmp - layout contains only a textview for the moment
rowView.setTag(holder);
} else {
holder = (ViewHolder)rowView.getTag();
}
holder.title.setText(meeting.getTrack());
return rowView;
}
}

请帮忙?为这个疯狂。

最佳答案

我发现问题出在 ListView 的 RecybleBin 对象上。它根据来自 getItemViewType 的报告类型存储可能的 convertViews,但是在您更改数据集(因此位置)之后,它的内容永远不会更新,然后当您的适配器根据其位置获取曾经是类型“X”的 View 时,但是现在它恰好是类型“Y”。一种解决方案是手动检查 getView 是否不仅 convertView 为 null,而且它的类型是否正确(有时真的很尴尬......如果您使用 View 持有者模式,您可以检查标签是否与相应的 View 持有者类匹配)

关于android - 为什么 getView 在 SeparatedListAdapter 上返回错误的 convertView 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018997/

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