2015-08-27 138 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。您節省了我的時間 –