【问题标题】:Android ListView Layouts get mixed up on scrollAndroid ListView 布局在滚动时混淆
【发布时间】:2015-08-27 16:05:26
【问题描述】:

我的自定义 ArrayAdapter 有一些问题。

我有两种不同的布局,我根据对象值应用于列表项。每次我滚动某些项目时,都会更改应应用R.layout.layout1 的位置,请使用R.layout.layout2 或其他方式。

我想到了在 XML 文件中缓存布局的一些问题。

问题我无法弄清楚为什么布局在滚动时会发生变化。

这是我的 Java 代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
        LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (this.items.get(position).getId() == this.id)
            convertView = layoutInflater.inflate(R.layout.layout1);
        else
            convertView = layoutInflater.inflate(R.layout.layout2);
        holder = new ViewHolder();
        holder.textView1 = (TextView) convertView.findViewById(R.id.textViewItem1);
        holder.textView2 = (TextView) convertView.findViewById(R.id.textViewItem2);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.textView1.setText(this.items.get(position).getInfo1());
    holder.textView2.setText(this.items.get(position).getInfo2());
    return convertView;
}

public static class ViewHolder {
    public TextView textView1;
    public TextView textView2;
}

这里是 ListView XML 部分:

<ListView
        android:id="@+id/listViewMessages"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:stackFromBottom="true"
        android:transcriptMode="normal" />

【问题讨论】:

  • 错误/问题是什么...?这是一个声明
  • 问题我无法弄清楚为什么布局在滚动时会发生变化。
  • 所以为了清楚起见,在你的问题上加上这个;)

标签: java android android-layout android-listview


【解决方案1】:

您的 convertView 可能正在被重用,您必须检查它何时与 null 不同,如果它是正确的布局并重新填充正确的布局。

您可以将布局 id 添加到 ViewHolder 并检查 convertView 是否不同于 null,如果 id 与您想要的不同,则膨胀正确的布局。

类似这样的:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;
    if(convertView == null || ((ViewHolder)convertView.getTag()).id != this.items.get(position).getId())
    {
        LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(this.items.get(position).getId() == this.id)
            convertView = layoutInflater.inflate(R.layout.layout1);
        else
            convertView = layoutInflater.inflate(R.layout.layout2);
        holder = new ViewHolder();
        holder.textView1 = (TextView) convertView.findViewById(R.id.textViewItem1);
        holder.textView2 = (TextView) convertView.findViewById(R.id.textViewItem2);
        holder.id = this.items.get(position).getId();
        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.textView1.setText(this.items.get(position).getInfo1());
    holder.textView2.setText(this.items.get(position).getInfo2());
    return convertView;
}

public static class ViewHolder
{
    public int id; //Assuming your id is an int, if not, changed it to the correct type
    public TextView textView1;
    public TextView textView2;
}

【讨论】:

  • 非常感谢!!我没有意识到我需要检查它是否是正确的布局。
  • 没问题,一开始我经常遇到这种情况:P
  • 非常感谢马可。你节省了我的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多