代码之家  ›  专栏  ›  技术社区  ›  orange01 Nathan Andrew Mullenax

Android ListView布局在滚动时变得混乱

  •  2
  • orange01 Nathan Andrew Mullenax  · 技术社区  · 9 年前

    我的习惯有些问题 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" />
    
    1 回复  |  直到 9 年前
        1
  •  5
  •   Marco Batista    6 年前

    您的convertView可能正在被重用,您必须检查它是否与null不同,是否是正确的布局,并重新标记正确的布局。

    您可以将布局id添加到ViewHolder,并检查convertView是否不同于null,然后如果id不同于所需的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;
    }