android - 为什么这个自定义监听器为空?

标签 android listener android-recyclerview

我正在尝试在我的 Recyclerview 适配器和 Activity 之间创建一个接口(interface),以便在单击适配器中的项目时,Activity 会做出相应的 react ,但监听器始终为 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();
    }
}

Activity

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

请问,您是否知道为什么它为空以及我该如何解决它?

最佳答案

您在给定的设置中有两个不同的 TagCatAdapter 实例;一个在 Activity 中,一个在 Fragment 中。您设置的 UrlTagCatClickedListener 已发布到在 Activity 中创建的那个上,但它是 FragmentTagCatAdapter 您在 RecyclerView 上设置的实例。那个没有设置监听器,因此它的 mTagCatClickedListener 始终为 null。

您只需要将给定的 UrlTagCatClickedListener 移动到 Fragment 中的 TagCatAdapter,并移除 TagCatAdapter来自 Activity,因为无论如何您都不会使用它。

关于android - 为什么这个自定义监听器为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174584/

相关文章:

android - 如何改变RecyclerView的顺序从右到左?

android - Android 是否支持使用 phonegap 的德语(不显示德语元音符号 Ü)

Javascript 共享具有独特状态的通用回调

android - 使用 SpanSizeLookup 为 GridLayoutManager 中的项目设置跨度

Android - 如何使用 RecyclerView.ViewHolder 将 View 添加到 LinearLayout

Java KeyListener 没有在 JSpinner 上触发

android - RxJavaCallAdapter 和结果代码

java - 等待另一个方法执行..然后继续

Android MediaStore 插入图片 已创建附加文件

java - SWT 表 - 复选框/突出显示监听器