【问题标题】:Open different activities by clicking on different cards in CardView ,Recyclerview Fragment in Android studio通过点击 CardView 中的不同卡片打开不同的活动,Android studio 中的 Recyclerview Fragment
【发布时间】:2018-08-30 11:33:29
【问题描述】:

我创建了一个 RecyclerView 并在片段中添加了卡片。我想通过单击 CardView 中的不同卡片来打开不同的活动。但我只能为所有卡片打开相同的活动。我在 StackOverFlow 中搜索了不同的答案。但我做不到。 你能告诉我如何解决这个问题...?如果你能给出完整的代码,我很高兴。

这是我的代码...

PDFFragment.java

public class PDFFragment extends Fragment {

    View v;
    List<Pdf> listBook;

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v= inflater.inflate(R.layout.fragment_pdf,container,false);
        listBook = new ArrayList<>();
        listBook.add(new Pdf("1-pdf name",R.drawable.pdf1image));
        listBook.add(new Pdf("2-pdf name",R.drawable.pdf2image));
        listBook.add(new Pdf("3-pdf name",R.drawable.pdf3image));
        listBook.add(new Pdf("4-pdf name",R.drawable.pdf4image);
        listBook.add(new Pdf("5-pdf name",R.drawable.pdf5image));
        listBook.add(new Pdf("6-pdf name",R.drawable.pdf6image));
        listBook.add(new Pdf("7-pdf name",R.drawable.pdf7image));

        RecyclerView myTV= (RecyclerView) v.findViewById(R.id.recyclerview_id);
        RecyclerViewAdapterPDF myAdapter = new RecyclerViewAdapterPDF(getActivity(),listBook);
//Part 1 -Start Changing number of columns
        myTV.setLayoutManager(new GridLayoutManager(getActivity(),calculateNoOfColumns(getActivity())));
//Part 1 -End Changing number of columns
        myTV.setAdapter(myAdapter);
        return v;
    }

    //Part 2 -Start Changing number of columns
    public int calculateNoOfColumns(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
        int noOfColumns = (int) (dpWidth / 120);
        return noOfColumns;
    }
    //Part 2 -End Changing number of columns
}

RecyclerViewAdapterPDF.java

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

    private Context mContext;
    private List<Pdf> mData;

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

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

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

    @Override
    public void onBindViewHolder( MyViewHolder holder, int position) {
        holder.tv_book_title.setText(mData.get(position).getTitle());
        holder.img_book_thumbnail.setImageResource(mData.get(position).getPhoto());
    }

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

    public static class MyViewHolder extends RecyclerView.ViewHolder{

        TextView tv_book_title;
        ImageView img_book_thumbnail;

        public MyViewHolder(View itemView) {
            super(itemView);

            tv_book_title = (TextView) itemView.findViewById(R.id.book_title_id);
            img_book_thumbnail = (ImageView) itemView.findViewById(R.id.book_image_id);
        }
     }
}

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentPagerAdapter {


    private final List<Fragment> fragmentList = new ArrayList<>();
    private final List<String> FragmentListTitles = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return FragmentListTitles.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return FragmentListTitles.get(position);
    }
    public void AddFragment(Fragment fragment,String Title){
        fragmentList.add(fragment);
        FragmentListTitles.add(Title);
    }
}

【问题讨论】:

    标签: java android android-fragments android-recyclerview


    【解决方案1】:

    您需要在视图支架上引用您的卡片:

    public static class MyViewHolder extends RecyclerView.ViewHolder{
    
            TextView tv_book_title;
            ImageView img_book_thumbnail;
            CardView cardview;
    
            public MyViewHolder(View itemView) {
                super(itemView);
    
                tv_book_title = (TextView) itemView.findViewById(R.id.book_title_id);
                img_book_thumbnail = (ImageView) itemView.findViewById(R.id.book_image_id);
                cardview = itemView.findViewById(R.id.yourCardId);
            }
         }
    

    并且在 onBindViewHolder() 上设置一个点击监听器负责打开活动:

    @Override
    public void onBindViewHolder( MyViewHolder holder, int position) {
            holder.tv_book_title.setText(mData.get(position).getTitle());
            holder.img_book_thumbnail.setImageResource(mData.get(position).getPhoto());
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                     public void onClick(View v) {
                        Intent intent;
                        switch (position) {
                            case 0:
                                intent = new Intent(mContext, pdfone.class);
                                mContext.startActivity(intent);
                                break;
                            case 1:
                                intent = new Intent(mContext, pdftwo.class);
                                mContext.startActivity(intent);
                                break;
                            ...
                            //do the same for every card possible
                       } 
                     }
    
    }
    

    【讨论】:

    • 我想为不同的卡片添加不同的活动。无论如何谢谢
    • "ThisPDFActivity.class" 你只提到了一个类..我想为每张卡片添加更多的活动类。例如:ThisPDFActivity1.class、ThisPDFActivity2.class
    • 是的,您可以进行检查以了解您拥有哪张卡,并相应地开始活动。你有多少张卡片,你的活动的实际名称是什么?我会尝试更新我的答案以帮助您解决这个问题
    • 现在我有 10 张卡片。将来我要添加更多卡片...您可以给我示例,然后我可以复制和粘贴代码(希望您使用 switch 语句或 if else 语句).我的类名是pdfone.class,pdftwo.class,pdfthree.class,pdffour.class等等....
    • 已修复!很高兴我能帮忙:)
    【解决方案2】:

    this这样使用反射

    所以在你的情况下,类似:

    String activityToStart = "com.pkg.pdf"+position;
        try {
            Class<?> c = Class.forName(activityToStart);
            Intent intent = new Intent(this, c);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            // print exception
        }
    

    当页面要改变时放入适配器中。

    【讨论】:

    • 我想为不同的卡片添加不同的活动。无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多