2016-03-28 51 views
0

私のアダプターでは、さまざまなテキスト色に黄色、オレンジ色、赤色の3種類のビューがあります。これらと一緒に行くために、私はサムネイル(hhy、hho、hhr)として3つの異なるイメージを持つようにしています。それが実行されると、イメージは対応するビューアイテムと一致しません。リストビューでは、早すぎたり遅すぎたりするアイテムが表示されます。イメージビューのレイアウト名が正しいので、正しく表示されない理由がわかりません。何が起こっているのリストビューアダプターで画像ビューが正しく表示されない

PostItemAdapter.java

@Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder viewHolder; 
     int listViewItemType = getItemViewType(position); 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.postitem, null); 

      viewHolder = new ViewHolder(); 
      //viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb); 

      if (listViewItemType == TYPE_short) { 
       viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel); 
       viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb); 
      } else if (listViewItemType == TYPE_med) { 
       viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1); 
       viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1); 
      } else { 
       viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2); 
       viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2); 
      } 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     if (listViewItemType == TYPE_short) { 
      viewHolder.itemTitleView.setText(datas.get(position).itemTitle); 
      viewHolder.itemThumbView.setImageResource(R.drawable.hhy); 
     } else if (listViewItemType == TYPE_med) { 
      viewHolder.itemTitleView.setText(datas.get(position).itemTitle); 
      viewHolder.itemThumbView.setImageResource(R.drawable.hho); 
     } else { 
      viewHolder.itemTitleView.setText(datas.get(position).itemTitle); 
      viewHolder.itemThumbView.setImageResource(R.drawable.hhr); 
     } 

     return convertView; 
    } 
} 

と関連するレイアウトpostitem.xml

<ImageView 
     android:id="@+id/itemThumb" 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:src="@drawable/hhy" 
     android:scaleType="centerCrop" 
     android:layout_marginRight="5dp"/> 

    <ImageView 
     android:id="@+id/itemThumb1" 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:src="@drawable/hho" 
     android:scaleType="centerCrop" 
     android:layout_marginRight="5dp"/> 

    <ImageView 
     android:id="@+id/itemThumb2" 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:src="@drawable/hhr" 
     android:scaleType="centerCrop" 
     android:layout_marginRight="5dp"/> 

    <TextView 
     android:id="@+id/itemTitleLabel" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@id/itemThumb" 
     android:layout_toRightOf="@id/itemThumb" 
     android:maxLines="2" 
     android:textIsSelectable="false" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:textColor="#ffff00" 
     android:ellipsize="end" 
     /> 

    <TextView 
     android:id="@+id/itemTitleLabel1" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@id/itemThumb" 
     android:layout_toRightOf="@id/itemThumb" 
     android:maxLines="2" 
     android:textIsSelectable="false" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:textColor="#ffa500" 
     android:ellipsize="end" 
     /> 

    <TextView 
     android:id="@+id/itemTitleLabel2" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@id/itemThumb" 
     android:layout_toRightOf="@id/itemThumb" 
     android:maxLines="2" 
     android:textIsSelectable="false" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:textColor="#ff0000" 
     android:ellipsize="end" 
     /> 

画像。 enter image description here

答えて

3

あなたに起こっているものとのいくつかの問題があります質問。リサイクルされたビューは、ListViewの可視部分を初めて完全に埋めるのに十分な時間だけ膨張され/作成されることを意図しています。それらは再び作成されるのではなく、スクロールするときにリサイクルされます。このブロックは、最初の数回だけと呼ばれている意味

:それ以降について

if (convertView == null) { 
     convertView = inflater.inflate(R.layout.postitem, null); 

     viewHolder = new ViewHolder(); 
     //viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb); 

     if (listViewItemType == TYPE_short) { 
      viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel); 
      viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb); 
     } else if (listViewItemType == TYPE_med) { 
      viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel1); 
      viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb1); 
     } else { 
      viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel2); 
      viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb2); 
     } 
     convertView.setTag(viewHolder); 
    } 

は、あなたのViewHolderが意図しないリソースを指しすることができリサイクルしています。現在のアイテムがTYPE_medの場合、viewHolder.itemThumbViewは別のリソース参照(作成時にTYPE_short)で作成されている可能性があります。他の2つのImageViews/TextViewsがぶら下がっているので、これを修正しても問題は解決しません。

私は複数のImageViews/TextViewsそうではなく、より受け入れられたアプローチは次のようになり、すべての上に可視性を設定することを持っている任意の明白な必要性を見ていないよ:

static class ViewHolder 
{ 
    private TextView mTextViewTitle; 
    private ImageView mImageViewThumb; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ViewHolder viewHolder; 
    Item i = datas.get(position); 
    int listViewItemType = i.viewtype; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.postitem, null); 

     viewHolder = new ViewHolder(); 

     viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.itemTitleLabel); 
     viewHolder.mImageViewThumb = (ImageView) convertView.findViewById(R.id.itemThumb); 

     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.mTextViewTitle.setText(i.itemTitle); 

    if (listViewItemType == TYPE_short) { 
     viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00")); 
     viewHolder.mImageViewThumb.setImageResource(R.drawable.hhy); 
    } else if (listViewItemType == TYPE_med) { 
     viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ffff00")); 
     viewHolder.mImageViewThumb.setImageResource(R.drawable.hho); 
    } else { 
     viewHolder.mTextViewTitle.setTextColor(Color.parseColor("#ff0000")); 
     viewHolder.mImageViewThumb.setImageResource(R.drawable.hhr); 
    } 

    return convertView; 
} 

あなたの色は、リソースで定義されている方が良いでしょうしかし、別の議論のためにそれを保存します。

あなたの新しいXML:

<ImageView 
    android:id="@+id/itemThumb" 
    android:layout_width="48dp" 
    android:layout_height="48dp" 
    android:scaleType="centerCrop" 
    android:layout_marginRight="5dp" /> 

<TextView 
    android:id="@+id/itemTitleLabel" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignTop="@id/itemThumb" 
    android:layout_toRightOf="@id/itemThumb" 
    android:maxLines="2" 
    android:textIsSelectable="false" 
    android:textSize="16sp" 
    android:textStyle="bold" 
    android:ellipsize="end" /> 
0

私の問題は、リストビューがリサイクルされているときに上書きされていたか、既存のイメージ/テキストを上書きできないということでした。私のやっかいな解決策は、次のコードを使用することでした。誰があなたはこの問題を解決することになっている方法を知っている場合、私はそれについて聞くことに興味がある:P

PostItemAdapter.java(ViewHolder)

static class ViewHolder 
    { 
     private TextView itemTitleViewY, itemTitleViewO, itemTitleViewR; 
     private ImageView itemThumbViewY, itemThumbViewO, itemThumbViewR; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder viewHolder; 
     Item i = datas.get(position); 
     int listViewItemType = i.viewtype; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.postitem, null); 

      viewHolder = new ViewHolder(); 

      viewHolder.itemTitleViewY = (TextView) convertView.findViewById(R.id.itemTitleLabel); 
      viewHolder.itemThumbViewY = (ImageView) convertView.findViewById(R.id.itemThumb); 
      viewHolder.itemTitleViewO = (TextView) convertView.findViewById(R.id.itemTitleLabel1); 
      viewHolder.itemThumbViewO = (ImageView) convertView.findViewById(R.id.itemThumb1); 
      viewHolder.itemTitleViewR = (TextView) convertView.findViewById(R.id.itemTitleLabel2); 
      viewHolder.itemThumbViewR = (ImageView) convertView.findViewById(R.id.itemThumb2); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     switch (listViewItemType) { 
      case 0: 
       viewHolder.itemTitleViewY.setText(i.itemTitle); 
       viewHolder.itemTitleViewO.setText(""); 
       viewHolder.itemTitleViewR.setText(""); 
       viewHolder.itemThumbViewY.setVisibility(View.VISIBLE); 
       viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE); 
       viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE); 
       Log.d("DEBUG CHECKME", "getItemViewType Y: " + i.itemTitle + ", " + i.viewtype + ", " + i); 
       break; 
      case 1: 
       viewHolder.itemTitleViewO.setText(i.itemTitle); 
       viewHolder.itemTitleViewY.setText(""); 
       viewHolder.itemTitleViewR.setText(""); 
       viewHolder.itemThumbViewO.setVisibility(View.VISIBLE); 
       viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE); 
       viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE); 
       Log.d("DEBUG CHECKME", "getItemViewType O: " + i.itemTitle + ", " + i.viewtype + ", " + i); 
       break; 
      case 2: 
       viewHolder.itemTitleViewR.setText(i.itemTitle); 
       viewHolder.itemTitleViewO.setText(""); 
       viewHolder.itemTitleViewY.setText(""); 
       viewHolder.itemThumbViewR.setVisibility(View.VISIBLE); 
       viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE); 
       viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE); 
       Log.d("DEBUG CHECKME", "getItemViewType R: " + i.itemTitle + ", " + i.viewtype + ", " + i); 
       break; 
      default: 
       viewHolder.itemTitleViewY.setText(""); 
       viewHolder.itemTitleViewO.setText(""); 
       viewHolder.itemTitleViewR.setText(""); 
       viewHolder.itemThumbViewY.setVisibility(View.INVISIBLE); 
       viewHolder.itemThumbViewO.setVisibility(View.INVISIBLE); 
       viewHolder.itemThumbViewR.setVisibility(View.INVISIBLE); 
       Log.d("DEBUG CHECKME", "getItemViewType D: " + i.itemTitle + ", " + i.viewtype + ", " + i); 
       break; 
     } 
     return convertView; 
    } 
関連する問題