2015-11-15 10 views
8

ich den Beispielcode von Google lese, ist der Code wie folgt:sollte ViewHold Verweis auf den Adapter halten?

public class AttractionListFragment extends Fragment { 
... 

private class AttractionAdapter extends RecyclerView.Adapter<ViewHolder> 
     implements ItemClickListener { 

    public List<Attraction> mAttractionList; 
    private Context mContext; 

    public AttractionAdapter(Context context, List<Attraction> attractions) { 
     super(); 
     mContext = context; 
     mAttractionList = attractions; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Log.d("TEST", "onCreateViewHolder"); 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     View view = inflater.inflate(R.layout.list_row, parent, false); 
     return new ViewHolder(view, this); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Attraction attraction = mAttractionList.get(position); 

     holder.mTitleTextView.setText(attraction.name); 
     holder.mDescriptionTextView.setText(attraction.description); 
     Glide.with(mContext) 
       .load(attraction.imageUrl) 
       .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
       .placeholder(R.drawable.empty_photo) 
       .override(mImageSize, mImageSize) 
       .into(holder.mImageView); 

     String distance = 
       Utils.formatDistanceBetween(mLatestLocation, attraction.location); 
     if (TextUtils.isEmpty(distance)) { 
      holder.mOverlayTextView.setVisibility(View.GONE); 
     } else { 
      holder.mOverlayTextView.setVisibility(View.VISIBLE); 
      holder.mOverlayTextView.setText(distance); 
     } 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public int getItemCount() { 
     return mAttractionList == null ? 0 : mAttractionList.size(); 
    } 

    @Override 
    public void onItemClick(View view, int position) { 
     View heroView = view.findViewById(android.R.id.icon); 
     DetailActivity.launch(
       getActivity(), mAdapter.mAttractionList.get(position).name, heroView); 
    } 
} 

private static class ViewHolder extends RecyclerView.ViewHolder 
     implements View.OnClickListener { 

    TextView mTitleTextView; 
    TextView mDescriptionTextView; 
    TextView mOverlayTextView; 
    ImageView mImageView; 
    ItemClickListener mItemClickListener; 

    public ViewHolder(View view, ItemClickListener itemClickListener) { 
     super(view); 
     mTitleTextView = (TextView) view.findViewById(android.R.id.text1); 
     mDescriptionTextView = (TextView) view.findViewById(android.R.id.text2); 
     mOverlayTextView = (TextView) view.findViewById(R.id.overlaytext); 
     mImageView = (ImageView) view.findViewById(android.R.id.icon); 
     mItemClickListener = itemClickListener; 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     mItemClickListener.onItemClick(v, getAdapterPosition()); 
    } 
} 

interface ItemClickListener { 
    void onItemClick(View view, int position); 
} 

}

können Sie sehen, jeder ViewHolder einen Verweis hält (ItemClickListener) an den Adapter, da der Adapter Referenz hält der ViewHolder bereits, weiß jemand, ob diese Art der Implementierung Speicherverlust verursachen würde? Bitte korrigieren Sie mich, wenn mein Verständnis falsch ist.

Antwort

0

Glauben Sie nicht, es würde. Die ViewHolder kann nicht ohne Adapter vorhanden sind, und Müll gut gesammelt werden, bevor der Adapter ist, da die ViewHolders ständig durch den Adapter zurückgeführt wird als die RecyclerView gescrollt wird. Das Schnittstellenmuster verwendet wird, ist nur ein üblicher Weg, die Adapter der Benachrichtigung, dass eine bestimmte ViewHolder geklickt wurde. Ich nehme an, Sie ein Speicherleck könnten, wenn Sie das Gegenteil tun, indem Sie einen Verweis auf einen bestimmten ViewHolder in einer Membervariable innerhalb der Adapter halten, da dies die ViewHolder davon, dass GC'd verhindern könnte. Trotzdem scheint der obige Code ziemlich Standard zu sein.

Verwandte Themen