2016-07-03 6 views
1

私はRecyclerviewアダプタとアクティビティの間にインターフェイスを作成しようとしています。そのため、アダプタ内のアイテムがクリックされるとアクティビティはそれに応じて反応しますが、リスナは常にnullになります。このカスタムリスナーはなぜnullですか?

インタフェース

public interface UrlTagCatClickedListener { 
    public void onUrlTagCatClicked (String chemicalURL); 
} 

アダプタ

public class TagCatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context mContext; 
    private List<TagCatItem> mTagCatItems; 
    private int lastPosition = -1; 

    private UrlTagCatClickedListener mTagCatClickedListener; 

    public TagCatAdapter(List<TagCatItem> tagCatItems, Context context) { 
     super(); 
     this.mTagCatItems = tagCatItems; 
     this.mContext = context; 
     this.mTagCatClickedListener = null; 
    } 

    public void setTagCatClickedListener (UrlTagCatClickedListener tagCatClickedListener) { 
     this.mTagCatClickedListener = tagCatClickedListener; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.tag_cat_item, parent, false); 
     return new ItemViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     final TagCatItem tagCatItem = mTagCatItems.get(position); 
     ((ItemViewHolder) holder).chemicalTitle.setText(Html.fromHtml(tagCatItem.getChemicalTitle())); 
     ((ItemViewHolder) holder).chemicalDate.setText(tagCatItem.getChemicalDate()); 
     ((ItemViewHolder) holder).chemicalTitle.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mTagCatClickedListener != null) { // mTagCatClickedListener is always null 
        mTagCatClickedListener.onUrlTagCatClicked(tagCatItem.getChemicalURL()); 
       } 
      } 
     }); 
    } 

    public class ItemViewHolder extends RecyclerView.ViewHolder{ 
     public TextView chemicalTitle, chemicalDate; 
     public ItemViewHolder(final View mView) { 
      super(mView); 
      chemicalTitle = (TextView) mView.findViewById(R.id.tagcat_title); 
      chemicalDate = (TextView) mView.findViewById(R.id.tagcat_date); 
     } 
    } 



    @Override 
    public int getItemCount() { 
     return mTagCatItems.size(); 
    } 
} 

活動

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "onCreate called") 
     //Skipped a lot of codes that doesn't relate to the queation 

     List<TagCatItem> mTagCatItems = new ArrayList<>(); 

     TagCatAdapter tagCatAdapter = new TagCatAdapter(mTagCatItems, this); 
     tagCatAdapter.setTagCatClickedListener(new UrlTagCatClickedListener() { 
      @Override 
      public void onUrlTagCatClicked(String chemicalURL) { 
       Log.d(TAG, "I go the url!!!!!!!!!! and it is + " + chemicalURL); 
      } 
     }); 
    } 

してください、あなたは持っていますなぜそれがnullで、どのように修正できるのか?

+0

他の 'TagCatAdapter'インスタンスをコードのどこに作成して設定していますか? –

+0

@MikeM。はい、RecyclerViewを含むフラグメントにあります。 – X09

+0

さて、投稿されたコードのものはおそらく 'RecyclerView'で設定している' Adapter'ではないでしょうから、 'Fragment'で設定したものはそのリスナーを持っていません。また、 'RecyclerView'が' Fragment'の中にある場合、 'Activity'のために' Adapter'を実際に作成したくはありません。 –

答えて

2

与えられた設定には、TagCatAdapterという2つの異なるインスタンスがあります。 Activityに1つ、Fragmentに1つあります。 Activityで作成したUrlTagCatClickedListenerを投稿しましたが、RecyclerViewに設定するのはFragmentTagCatAdapterインスタンスです。それにはリスナーが設定されていないため、mTagCatClickedListenerは常にnullです。

あなただけのFragmentTagCatAdapterに与えられたUrlTagCatClickedListenerを移動し、あなたはとにかく1つを使用していないとして、ActivityからTagCatAdapterを削除する必要があります。

+1

ありがとう、この解決策は私が問題を解決するのに役立ちました。 – X09

関連する問題