Java ListActivity中的BaseAdapter不是';t显示正确的项目
我有一个Java ListActivity中的BaseAdapter不是';t显示正确的项目,java,android,adapter,listactivity,Java,Android,Adapter,Listactivity,我有一个ListActivity,我试图在列表下显示一个ImageView。我试图通过创建自己的BaseAdapter并在getView方法中使用两种不同的方法来实现这一点,一种用于列表,另一种用于ImageView。我成功地将ImageView以我想要的方式显示在列表下,但我遇到的问题是列表没有正确显示 由于某些原因,列表中的任何项目在用户向下滚动之前都不会出现在屏幕上,因此会填充错误的数据,如下所示: ----Top Screen------ | Item 1 | |
ListActivity
,我试图在列表下显示一个ImageView
。我试图通过创建自己的BaseAdapter
并在getView
方法中使用两种不同的方法来实现这一点,一种用于列表,另一种用于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 |
我的自定义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;
}
私有类MyCustomAdapter扩展了BaseAdapter{
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
私有静态最终整数类型\最大\计数=类型\分隔符+1;
private ArrayList mData=new ArrayList();
私人停车场;
私有树集mseparatorset=新树集();
公共MyCustomAdapter(){
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}
公共无效附加项(最终字符串标题、最终字符串消息){
HashMap项=新建HashMap();
项目放置(第1行,标题);
项目.放置(第2行,消息);
mData.add(项目);
notifyDataSetChanged();
}
公共无效addImageItem(){
HashMap项=新建HashMap();
项目.付诸表决(第1行“”);
项目.付诸表决(第2行“”);
mData.add(项目);
mSeparatorsSet.add(mData.size()-1);
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回mseparatorset.contains(位置)?TYPE_分隔符:TYPE_项;
}
@凌驾
public int getViewTypeCount(){
返回类型\最大\计数;
}
public int getCount(){
返回mData.size();
}
公共对象getItem(int位置){
返回mData.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗持有人vh=空;
int type=getItemViewType(位置);
System.out.println(“getView”+位置+“”+convertView+”类型=“+类型);
if(convertView==null){
vh=新的视窗支架();
开关(类型){
案例类型\u项目:
convertView=mInflater.充气(R.LAYOU.INDUCTIONS\u两行,空);
vh.header=(TextView)convertView.findViewById(R.id.instructions\u header);
vh.message=(TextView)convertView.findViewById(R.id.instructions\u message);
vh.header.setText((CharSequence)mData.get(position.get(第1行));
vh.message.setText((CharSequence)mData.get(position.get(第2行));
打破
箱型分离器:
convertView=mInflater.充气(R.layout.instructions\u图像,空);
vh.imageView=(imageView)convertView.findViewById(R.id.instruct_image);
vh.imageView.setImageDrawable(getResources().getDrawable(R.drawable.instructions));
打破
}
convertView.setTag(vh);
}
否则{
vh=(ViewHolder)convertView.getTag();
}
返回视图;
}
}
公共静态类视图持有者{
公共文本视图标题;
公共文本视图消息;
公共影像视图;
}
谢谢大家的帮助
getView
在滚动时回收视图。如果convertView不为null,您仍需要检查它是否为正确的类型,并在其上设置正确的值。删除了以前的注释。我想说的是,我该如何检查它是否已经设置了正确的值,还是每次都必须设置它?我想最简单的方法就是每次都设置它。这就是我最终要做的。我会给你+1,但它不会让我这么做。谢谢
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;
}