2015-08-27 248 views
1

我的自定义ArrayAdapter有一些问题。Android ListView布局滚动滚动

我有两种不同的布局,我根据对象值应用于列表项。每当我滚动某些项目时应更改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

请告诉我的错误/问题...?这是一个声明 –

+0

问题我不知道为什么布局在滚动上发生变化。 – orange01

+0

因此,为了清晰起见,请在此问题上添加该内容;) – Mauker

回答

4

你convertView可能是被重用,你必须检查的时候它是不同的,如果它是正确的布局,并重新正确的布局。

您可以将布局ID添加到ViewHolder,并检查它是否与convertView不同,然后如果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; 
} 
+0

非常感谢!我没有意识到我需要检查它是否是正确的布局。 – orange01

+0

没问题,它在开始时曾经发生过很多事情:P –

+0

非常感谢marco。您节省了我的时间 –