【问题标题】:how to intent from recyclerview to fragment如何从recyclerview到fragment
【发布时间】:2019-05-25 14:50:16
【问题描述】:

我想将意图从我的 SeriesVBAdapter 应用到我的 Fragment,但出现错误。我实现了接口,但找不到解决方案。我想将数据从 SeriesVBAdapter 发送到 DescriptionFragment。在这样做的过程中,我尝试了 SeriesVBAdapter 到 DescriptionActivity,然后是 DescriptionFragment,但我得到了错误。

(网站上的解决方案让我更加困惑。)

系列监听器

public interface SeriesListener {void seriesKnowledge(String title,String desc,int thumb);}

SeriesRVAdapter

public class SeriesRVAdapter extends RecyclerView.Adapter<SeriesRVAdapter.MyViewHolder> {

private Context mContext;
private List<SeriesDB> mData;
private SeriesListener mSeriesListener;

public SeriesRVAdapter(Context mContext, List<SeriesDB> mData) {
    this.mContext = mContext;
    this.mData = mData;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view;
    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view = mInflater.inflate(R.layout.cardview_item_categories,parent,false);
    MyViewHolder holder = new MyViewHolder(view,mSeriesListener);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {

    holder.seriesTitle.setText(mData.get(position).getTitle());
    holder.seriesImage.setImageResource(mData.get(position).getThumbnail());
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mSeriesListener.seriesKnowledge(mData.get(position).getTitle(),mData.get(position).getDescription(),mData.get(position).getThumbnail());
        }
    });
}

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

public static class MyViewHolder extends RecyclerView.ViewHolder{

    TextView seriesTitle;
    ImageView seriesImage;
    CardView cardView;
    SeriesListener mSeriesListener;

    public MyViewHolder(View itemView, SeriesListener seriesListener){
        super(itemView);

        seriesTitle = itemView.findViewById(R.id.series_title_id);
        seriesImage = itemView.findViewById(R.id.series_img_id);
        cardView =  itemView.findViewById(R.id.cardview_series_id);
        mSeriesListener = seriesListener;
    }

}
}

描述活动

public class DescriptionActivity extends AppCompatActivity implements  SeriesListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_description);
}


@Override
public void seriesKnowledge(String title, String desc, int thumb) {

    FragmentManager manager = getFragmentManager();

    DecriptionFragment decriptionFragment = (DecriptionFragment) manager.findFragmentById(R.id.description_fr);
    decriptionFragment.sendData(title,desc,thumb);

}
}

DecriptionFragment

public class DecriptionFragment extends Fragment {

View view;
ImageView img;
TextView tx1;
TextView tx2;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_description,container,false);

    img = view.findViewById(R.id.description_image_id);
    tx1 = view.findViewById(R.id.description_series_id);
    tx2 = view.findViewById(R.id.description_series_category);

    return view;
}

public void sendData(String title, String desc, int thumb)
{
    img.setImageResource(thumb);
    tx1.setText(title);
    tx2.setText(desc);
}
}

类别片段

公共类 CategoriesFragment 扩展 Fragment {

View view;
List<SeriesDB> seriesDBS;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_categories, container, false);

    seriesDBS = new ArrayList<>();
    seriesDBS.add(new SeriesDB("Arrow", "Crime","Decription Arrow",R.drawable.arrow));
    seriesDBS.add(new SeriesDB("Flash", "Crime","Decription Flash",R.drawable.flash));
    seriesDBS.add(new SeriesDB("Supernatural", "Crime","Decription Supernatural",R.drawable.supernatural));
    seriesDBS.add(new SeriesDB("The Originals", "Crime","Decription Originals",R.drawable.originals));
    seriesDBS.add(new SeriesDB("The Legacies", "Crime","Decription Legacies",R.drawable.legacies));
    seriesDBS.add(new SeriesDB("Peaky Blinders", "Crime","Decription Peaky Blinders",R.drawable.peaky));
    seriesDBS.add(new SeriesDB("Arrow", "Crime","Decription Arrow",R.drawable.arrow));
    seriesDBS.add(new SeriesDB("Flash", "Crime","Decription Flash",R.drawable.flash));
    seriesDBS.add(new SeriesDB("Supernatural", "Crime","Decription Supernatural",R.drawable.supernatural));
    seriesDBS.add(new SeriesDB("The Originals", "Crime","Decription Originals",R.drawable.originals));
    seriesDBS.add(new SeriesDB("The Legacies", "Crime","Decription Legacies",R.drawable.legacies));
    seriesDBS.add(new SeriesDB("Peaky Blinders", "Crime","Decription Peaky Blinders",R.drawable.peaky));

    RecyclerView myrv = (RecyclerView) view.findViewById(R.id.recyclerView_series_id);
    SeriesRVAdapter myAdapter = new SeriesRVAdapter(getActivity(),seriesDBS);
    myrv.setLayoutManager(new GridLayoutManager(getContext(),3));
    myrv.setAdapter(myAdapter);
    return view;
}

}

--------- beginning of crash

2018-12-02 17:44:33.663 6704-6704/com.example.forev.neizledim E/AndroidRuntime: 致命异常: main 进程:com.example.forev.neizledim,PID:6704 java.lang.NullPointerException:尝试在空对象引用上调用接口方法 'void com.example.forev.neizledim.SeriesListener.seriesKnowledge(java.lang.String, java.lang.String, int)' 在 com.example.forev.neizledim.adapter.recyclerview.SeriesRVAdapter$1.onClick(SeriesRVAdapter.java:49) 在 android.view.View.performClick(View.java:5637) 在 android.view.View$PerformClick.run(View.java:22429) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

【问题讨论】:

    标签: android


    【解决方案1】:

    由于 mSeriesListener 未初始化,因此适配器内部的 onClick 方法出现空指针异常,因此请将其添加到 SeriesRVAdapter

    public void setSeriesListener(SeriesListener mSeriesListener) {
        this.mSeriesListener = mSeriesListener;
    }
    

    这个给CategoriesFragment

    SeriesRVAdapter myAdapter = new SeriesRVAdapter(getActivity(),seriesDBS);
    myAdapter.setSeriesListener(this);
    

    并在CategoriesFragment 处实现seriesKnowledge 方法:

    public void seriesKnowledge(String title,String desc,int thumb){
    }
    

    【讨论】:

    • 对不起,我不知道在哪里添加它。你说我应该执行,但如果执行了,我是不是要删除其他方?通常我是私信写的,但我无法理解网站上的操作,所以我在这里再次回答。如果我不能再次解决,我们可以联系你的推特吗?
    • 我更新了我的答案希望现在很清楚,你不需要删除任何东西
    • 应用程序关闭问题已解决,但并非有意。应用程序目前没有关闭,但我的按钮在我点击时没有任何意图。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多