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;
    }