android - 如何避免 ListAdapter 的回收项目问题?

标签 android listview

我相信遵循避免回收 ListView 数据的标准模式,但我失败了。和往常一样,listview的最后两项(在首屏下面...从之前的其他位置获取数据)

public static class ViewHolder {
    public ImageView img1;
    public ImageView img2;  
    public TextView text1;
    public TextView text2;
    public TextView text3;
    public TextView text4;
  }

public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        ViewHolder holder;
        if( convertView == null ){
            vi = inflater.inflate(R.layout.item, null);
            holder=new ViewHolder();
            holder.text1=(TextView)vi.findViewById(R.id.text1);
            holder.text2=(TextView)vi.findViewById(R.id.text2);
            holder.text3=(TextView)vi.findViewById(R.id.text3);
            holder.text4=(TextView)vi.findViewById(R.id.text4);         
            holder.img1=(ImageView)vi.findViewById(R.id.img1);
                    holder.img2=(ImageView)vi.findViewById(R.id.img2);
            vi.setTag(holder);
        } else {
            holder=(ViewHolder)vi.getTag();
        }

            String shorten=shortenText(t4);
    holder.text.setTag(shorten);
    holder.text.setText(shorten);   

    if(t1){
        holder.text1.setTag(thisMsg.get(D_ENUM.T1));
        holder.innerName.setText(thisMsg.get(thisMsg.get(D_ENUM.T1));
    }
    if(t2){
        holder.text1.setTag(thisMsg.get(D_ENUM.T2));
        holder.innerName.setText(thisMsg.get(thisMsg.get(D_ENUM.T2));
    }
    if(thisMsg.containsKey(D_ENUM.T3)){
        String t3 = shortenText(thisMsg.get(D_ENUM.T3));
        holder.innerDesc.setTag(t3);
        holder.innerDesc.setText(t3);
    }

    holder.img1.setTag(img1);
    imageLoader.DisplayImage(img1, act, holder.img1);

    if(img2 != null) { 
        holder.innerImage.setTag(img2);
        holder.innerImage.setVisibility(View.VISIBLE);
        imageLoader.DisplayImage(img2, act, holder.img2);
    } else {
        holder.innerImage.setTag(img2);
        holder.innerImage.setVisibility(View.GONE);
    }

    return vi;

最佳答案

您必须为 ViewHolder 的所有成员设置内容,即使这意味着如果您没有任何内容可显示,则将它们设置为空值。

明白你得到的View(convertView)和关联的ViewHolder(holder)已经被前面执行的getView函数填充了;它们不是新创建的具有默认值的对象

关于android - 如何避免 ListAdapter 的回收项目问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962872/

相关文章:

flutter - 在 flutter 中将 Firebase 数据获取为 Listview 构建器

android - 我想为以下 Android 游戏使用哪些容器/类?

android - 滚动 ListView 时出现内存不足异常?

java - Android:ListView 上的 Sqlite

android - OnItemClickListener 不适用于包含按钮的 ListView 项目

内置 ListView 的 Android CardView - CardView 上的 onTouchListener 无法正常工作

android - LayoutParams 在 Android 中做什么或传递什么?

android - 在 TabHost 上获取错误

android - 无法从 androidx.fragment.app.Fragment.getViewModelStore 处的分离 fragment 访问 spy ( fragment )对象的 ViewModel

android - 如何在 ListView 中获取列表项位置?