2016-03-28 16 views
0

Bağdaştırıcımda, farklı metin rengi için sarı, turuncu ve kırmızı kullanılarak üç görünüm var. Bunlarla birlikte ilerlemek için, küçük resimler olarak üç farklı resme sahip olmaya çalışıyorum (hhy, hho, hhr). Görüntüleri çalıştırdığında, karşılık gelen görünüm öğesi ile eşleşmiyor, hho ve hhy bir liste çok erken ya da geç liste görünümünde alıyorum. Resim görünümü mizanpajı ismim doğru. Bu yüzden neden doğru şekilde görüntülenmediğinden emin değilim. bitenlerdenImageview liste görünümü bağdaştırıcısı aracılığıyla düzgün görüntülenmiyor

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; 
    } 
} 

ve ilgili düzen 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" 
     /> 

Görüntü; enter image description here

cevap

3

P

PostItemAdapter.java (ViewHolder) sizin soru. Geri dönüşümlü görünümler, sadece ListView'inizin görünür kısmını tam olarak ilk kez doldurmak için şişirilmiş/yeterli sayıda oluşturulmak üzere tasarlanmıştır. Daha sonra yeniden oluşturduğunuzdan, ilerledikçe bunlar geri dönüştürülür. Bu bloğu anlamına

yalnızca ilk birkaç kez denir: müteakip için

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); 
    } 

sizin ViewHolder istenmeyen kaynak göstererek olabilir geri dönüştürür. Geçerli öğe TYPE_med ise, viewHolder.itemThumbView farklı bir kaynak başvurusuyla oluşturulmuş olabilir (yani oluşturma zamanında TYPE_short). Bu sorunu gidermek sorunu çözmeyecektir çünkü diğer iki ImageViews/TextViews etrafta asılı kalıyor.

Birden ImageViews olması görünürde herhangi ihtiyacını görmüyorum/TextView'lar yüzden ziyade her konuda görüş ayarı daha kabul yaklaşım olacaktır:

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; 
} 

daha iyi olurdu renklerin kaynaklarında tanımlanan etmiş ama bunu başka bir tartışma için saklayacağım.

Yeni 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

Sorunum, liste görünümü görünümleri geri dönüştürüldüğünde önceden varolan resim/metin üzerine yazılıyordu veya üzerine yazamıyordu. Benim oldukça hacky çözümüm aşağıdaki kodu kullanmaktı. Herkes bunu çözmek gerekiyordu şeklini biliyorsa bu konuda işitme ilgilenen olacaktır: Eğer oluyor ne ile bazı sorunlar var

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; 
    } 
İlgili konular