[英]BaseAdapter in ListActivity isn't displaying the correct items
我有一个ListActivity
,我试图在其中显示一个ImageView
。 我正在尝试通过创建自己的BaseAdapter
并在getView
方法中使用两种不同的方法来实现此BaseAdapter
,一种用于List,另一种用于ImageView
。 我设法将ImageView
显示在所需的列表下方,但是我遇到的问题是列表未正确显示。
由于某种原因,列表中直到用户向下滚动才出现在屏幕上的任何项目都会填充错误的数据,如下所示:
----Top Screen------
| Item 1 |
| Item 2 |
| Item 3 |
| Item 4 |
----Bottom Screen---
| Item 1 | <--Items not on the screen show
| Item 1 | <--as item 1 once the user scrolls
| Image View |
它应该是这样的:
----Top Screen------
| Item 1 |
| Item 2 |
| Item 3 |
| Item 4 |
----Bottom Screen---
| Item 5 |
| Item 6 |
| Image View |
我的自定义BaseAdapter
private class MyCustomAdapter extends BaseAdapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ArrayList<HashMap<String,String>> mData = new ArrayList<HashMap<String,String>>();
private LayoutInflater mInflater;
private TreeSet mSeparatorsSet = new TreeSet();
public MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final String header, final String message) {
HashMap<String,String> item = new HashMap<String,String>();
item.put(LINE_1, header);
item.put(LINE_2, message);
mData.add(item);
notifyDataSetChanged();
}
public void addImageItem() {
HashMap<String,String> item = new HashMap<String,String>();
item.put(LINE_1, "");
item.put(LINE_2, "");
mData.add(item);
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
public int getCount() {
return mData.size();
}
public Object getItem(int position) {
return mData.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = null;
int type = getItemViewType(position);
System.out.println("getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
vh = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.instructions_two_row, null);
vh.header = (TextView) convertView.findViewById(R.id.instructions_header);
vh.message = (TextView) convertView.findViewById(R.id.instructions_message);
vh.header.setText((CharSequence) mData.get(position).get(LINE_1));
vh.message.setText((CharSequence) mData.get(position).get(LINE_2));
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.instructions_image, null);
vh.imageView = (ImageView) convertView.findViewById(R.id.instuct_image);
vh.imageView.setImageDrawable(getResources().getDrawable(R.drawable.instructions));
break;
}
convertView.setTag(vh);
}
else {
vh = (ViewHolder) convertView.getTag();
}
return convertView;
}
}
public static class ViewHolder {
public TextView header;
public TextView message;
public ImageView imageView;
}
谢谢大家的帮助!
getView
在滚动时回收视图。 如果convertView不为null,则仍然需要检查它是否为正确的类型并为其设置正确的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.