2016-12-10 1 views
1

Ich habe diesen benutzerdefinierten Adapter für Bilder und ich möchte ändern, damit es das Ansichtshaltermuster darin hat. Kann mir bitte jemand helfen, herauszufinden, wie ich meinen Code ändern kann, damit er View Holder-Muster darin hat, wenn es überhaupt möglich ist?Wie man kundenspezifischen Adapter mit Ansichthaltermuster herstellt?

public class ImageAdapter extends BaseAdapter { 

private final int imageTotal; 
private ArrayList<String> urlList = new ArrayList<>(); 
private final Context mContext; 

public ImageAdapter(Context context, ArrayList<String> uList) { 
    mContext = context; 
    urlList = uList; 
    imageTotal = uList.size(); 
} 

public int getCount() { 
    return imageTotal; 
} 

@Override 
public String getItem(int position) { 
    return urlList.get(position); 
} 

public long getItemId(int position) { 
    return 0; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(mContext); 
     imageView.setAdjustViewBounds(true); 
    } else { 
     imageView = (ImageView) convertView; 
    } 
    String url = getItem(position); 

    Picasso.with(mContext) 
      .load(url) 
      .placeholder(R.drawable.loader) 
      .fit() 
      .into(imageView); 
    return imageView; 
} 

}

+1

Wenn Sie wissen, dass das ViewHolder Muster vorhanden ist, sollte es möglich sein, einige Tutorials auf, es zu finden –

+0

Sie auch nutzen könnten RecyclerView, das Sie zwingt, einen ViewHolder –

Antwort

2

Sie verwenden Ihre Ansicht als nur ein Image, so das ViewHolder Muster keinen Sinn macht.

Nehmen wir an, Sie müssen der Ansicht eine TextView hinzufügen, daher müssen Sie eine benutzerdefinierte Layoutdatei mit einem ImageView (definieren wir seine ID als R.id.image) und einem TextView (definieren wir seine ID) erstellen als R.id.text).

So Ihr Code wie folgt aussehen: (Ich werde die unveränderten Teile weglassen)

public class ImageAdapter extends BaseAdapter { 

    static class ViewHolder { 
     ImageView image; 
     TextView text; 

     ViewHolder(View v) { 
      image = v.findViewById(R.id.image); 
      text = v.findViewById(R.id.text); 
     } 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 
     if (convertView == null) { 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); 
      viewHolder = new ViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     String url = getItem(position); 

     Picasso.with(mContext) 
       .load(url) 
       .placeholder(R.drawable.loader) 
       .fit() 
       .into(viewHolder.image); 
     viewHolder.text.setText("my text"); 
     return imageView; 
    } 
} 

Die Idee hinter ViewHolder ist die erneute Bindung zu vermeiden. Es ist auch nützlich, Verhaltensweisen zu trennen.

Aber wie kommentiert von @ cricket_007, sollten Sie RecyclerView verwenden, die Sie ViewHolder verpflichtet :)

+0

Plus Picasso zu verwenden, sollte die Bilder sowieso zwischenspeichern, so dass der ViewHolder nicht viel Nutzen bringt. –

+0

Danke. wie ich dachte, habe ich keine Verwendung für View Holder. –

+0

@ cricket_007 Das Ziel des ViewHolders ist es, findViewById nicht in jedem getView aufzurufen. Der Cache von Picasso funktioniert nur für das Bildobjekt. – jonathanrz

Verwandte Themen