2015-11-15 4 views
8

私はGoogleからのサンプルコードを読んでいます、コードはこのようなものです:あなたは、アダプタがへの参照を保持しているため、すべてのViewHolderは、アダプタへの参照(ItemClickListener)を保持して見ることができますは、アダプタのviewholder保持参照ですか?

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

}

ViewHolderはすでに、この種の実装がメモリリークを引き起こすかどうかを知っていますか?私の理解が間違っていれば私を修正してください。

答えて

0

そう思わないでしょうか。 ViewHolderはアダプタなしでは存在できず、RecHlerlerViewがスクロールされたときにViewHoldersがアダプタによって常にリサイクルされているため、アダプタの前にガベージコレクションが行われます。使用されているインタフェースパターンは、あるViewHolderがクリックされたことをアダプタに通知する一般的な方法です。 ViewHolderがGCされないようにするために、アダプタ内のメンバ変数内の特定のViewHolderへの参照を保持することによって、逆のことを行うとメモリがリークする可能性があります。それにもかかわらず、上記のコードはかなり標準的なようです。

関連する問題