2016-03-28 18 views
0

In meinem Adapter habe ich drei Variationen der Ansicht mit gelb, orange und rot für ihre unterschiedliche Textfarbe. Um mit diesen zu gehen, versuche ich drei verschiedene Bilder als Thumbnails zu haben (hhy, hho, hhr). Wenn es läuft, stimmen die Bilder nicht mit ihrem entsprechenden Ansichtselement überein, ich bekomme das hho und hhy entweder einen Gegenstand zu früh oder zu spät in der Listview. Ich habe die Namen der Imageview-Layouts korrigiert, daher bin ich mir nicht sicher, warum sie nicht korrekt angezeigt werden.Bildansicht nicht korrekt über Listview-Adapter

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

und das entsprechende Layout 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" 
     /> 

Bild von dem, was geschieht;

Antwort

3

Es gibt ein paar Probleme mit dem, was Sie in Ihrem los haben Frage. Recycelte Ansichten sollen nur so oft aufgeblasen werden, dass der sichtbare Teil Ihres ListViews zum ersten Mal vollständig gefüllt wird. Sie werden dann beim Scrollen und nicht erneut erstellt.

die in diesem Block bedeutet, ist nur die ersten paar Mal genannt:

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

Für nachfolgende rezykliert Ihre ViewHolder bei einer unbeabsichtigten Ressource zeigen werden. Wenn das aktuelle Element TYPE_med ist, könnte die viewHolder.itemThumbView mit einer anderen Ressourcenreferenz (d. H. TYPE_short zum Zeitpunkt der Erstellung) erstellt worden sein. Dies zu beheben wird Ihr Problem nicht lösen, da Sie die anderen beiden ImageViews/TextViews herumhängen haben.

ich keine offensichtliche Notwendigkeit sehen mehrere ImageViews haben/Textviews so anstatt Einstellung Sichtbarkeit auf alles, was die mehr akzeptiert Ansatz wäre:

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

Es wäre besser, Ihre Farben in Ressourcen definiert haben , aber ich werde das für eine weitere Diskussion speichern.

Ihr neues 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

Okay, mein Problem ist, dass, wenn die Listview-Ansichten wiederverwendet wurden, sie das bereits vorhandene Bild/Text überschreiben oder nicht überschreiben konnten. Meine eher hacky Lösung war, den folgenden Code zu verwenden. Wenn jemand wie Sie sollen lösen weiß das würde ich zu hören, über sie interessieren: 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; 
    }