Android CustomAdapter的getView()出现意外行为

Android CustomAdapter的getView()出现意外行为,android,listview,Android,Listview,我有一个像这样的ViewHolder类 static class ViewHolder { protected String fileName; protected Bitmap bitmap = null; protected CheckBox checkBox; protected int position; protected int resourceId = 0; protected ImageView imageView;

我有一个像这样的
ViewHolder

    static class ViewHolder {
    protected String fileName;
    protected Bitmap bitmap = null;
    protected CheckBox checkBox;
    protected int position;
    protected int resourceId = 0;
    protected ImageView imageView;
    protected TextView textView;
}
在我的
getView()中

此时,当我使用
notifydatasetchange()
刷新适配器而不更改数据时,通过调用
getTag()
得到的
ViewHolder
返回了错误的标记。它工作起来就像

如果位置为1,则支架对象位于位置0处的视图中。ie;已返回上一个对象

最后我找到了一个

这是不一样的,但使用相同的方法,解决方案对我有效。。我不知道怎么

解决方案是

在xml中将
ListView
的宽度设置为
MATCH\u PARENT
,在帖子中是
height


有谁知道,这种行为的原因是什么?我在这个问题背后找不到任何逻辑

似乎当你不使用这个解决方法时,Android必须多次调整listview的布局,直到它被执行为止。这就是为什么许多用户抱怨
getView()
被调用的次数超过了它“应该”的次数

无论如何,请注意,
getView()
并不是按顺序调用的,它是按Android确定的顺序调用的,所以不要期望标签按顺序显示

---编辑---


第48页。希望这有帮助

你能发布初始化视图持有者的代码吗?我刚刚更新了整个代码我不知道这方面的准确解释,但我猜当宽度设置为
MATCH\u PARENT
(实际上应该如此)时,Android已经正确呈现了布局,之所以按顺序调用它,是因为Android认为每一行都“难以”渲染。另一方面,当设置为
WRAP_CONTENT
时,除了显示布局外,每一行都必须呈现为确定的布局,Android在呈现每一行时会处理
getView()
,这意味着每一行不必都相等,这就是为什么它不是顺序的。谢谢你试着帮我解释你知道的,可能是这样,但我在寻找一些精确的解决方案,因为这是我们通常在每个程序上工作的,所以我不想在没有知识的情况下做。我刚刚发现:在第48页有一点关于它。遗憾的是,它现在更详细了一点,但给出了一个想法。是的,那太好了。。。应该记录以下假设:(我们如何知道它是否像这样???事实上,有趣的是,我发现这是在寻找一个完全不同的主题:-)我会保留该页面,希望至少其他用户可以帮助你的问题(我投了更高的票)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;

    if(convertView != null)
    {
        ViewHolder holder = (ViewHolder) convertView.getTag();
        if(!holder.fileName.equals(fileList.get(position)))
            convertView = null;
    }
    if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.image_layout, null, false);
        viewHolder = new ViewHolder();

        viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
        viewHolder.textView = (TextView) convertView.findViewById(R.id.text);

        // Set viewHolder attributes
        viewHolder.position = position;
        viewHolder.fileName = fileList.get(position);;

        // set the checkbox
        viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);

        // Set the path of the file
        final String filePath = context.getBasePath(position);

        if(new File(filePath).isDirectory())
        {
            viewHolder.imageView.setImageResource(R.drawable.folder);
            viewHolder.resourceId = R.drawable.folder;
        }
        else
        {
            String mimeType = Utility.getMimeType(filePath);
            if(mimeType.contains("image"))
            {
                loadImage(viewHolder, viewHolder.imageView, filePath);
            }
            else
                viewHolder.resourceId = handleFile(viewHolder.imageView, filePath);
        }
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder) convertView.getTag();

        if(viewHolder.bitmap == null)
            viewHolder.imageView.setImageResource(viewHolder.resourceId);
        else
            viewHolder.imageView.setImageBitmap(viewHolder.bitmap);
    }

    viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton checkBox, boolean checked) {
            viewHolder.checkBox.setChecked(checked);
            listener.onFileStateChanged(viewHolder.position, checked);
        }
    });

    // set the fileName
    viewHolder.textView.setText(viewHolder.fileName);

    if(checkBoxVisibility)
        viewHolder.checkBox.setVisibility(View.VISIBLE);
    else
        viewHolder.checkBox.setVisibility(View.INVISIBLE);

    return convertView;
}