【问题标题】:How to open a new fragment when click on the CardView + RecyclerView单击 CardView + RecyclerView 时如何打开新片段
【发布时间】:2018-05-01 13:10:58
【问题描述】:

在我的应用中,我有 15 个卡片视图,现在我想在单击卡片视图时显示一个片段,因为我有 15 个片段。

RecyclerViewAdapter.java

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

        private Context mContext;
        private List<reminder> mData;

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

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

            View view;
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            view = inflater.inflate(R.layout.cardview, parent, false);
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.mTextView.setText(mData.get(position).getmTitle());
            holder.mImageView.setImageResource(mData.get(position).getmImages());
        }

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

        public static class MyViewHolder extends RecyclerView.ViewHolder {

            TextView mTextView;
            ImageView mImageView;

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

                mTextView = (TextView) itemView.findViewById(R.id.mReminder_Text_Id);
                mImageView = (ImageView) itemView.findViewById(R.id.mReminder_Image_Id);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        switch (getAdapterPosition()) {
                            case 0 :

    //                            "What Should I do here"
                        }
                    }
                });

            }
        }
    }

Reminders.java

public class Reminders extends Fragment {

private OnFragmentInteractionListener mListener;
List<reminder> lstreminder;

public Reminders() {

}

public static Reminders newInstance(String param1, String param2) {
    Reminders fragment = new Reminders();
    Bundle args = new Bundle();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
    }
}

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

        lstreminder = new ArrayList<>();
        lstreminder.add(new reminder("Alarm",R.drawable.alarms));
        lstreminder.add(new reminder("Birthday",R.drawable.birthdays));
        lstreminder.add(new reminder("Anniversary",R.drawable.anniversaries));
        lstreminder.add(new reminder("Buy Gifts",R.drawable.buygift));
        lstreminder.add(new reminder("Bill Payments",R.drawable.billpayments));
        lstreminder.add(new reminder("Call / SMS",R.drawable.call));
        lstreminder.add(new reminder("Recharges",R.drawable.recharges));
        lstreminder.add(new reminder("Meetings",R.drawable.meetings));
        lstreminder.add(new reminder("Insurance",R.drawable.insurances));
        lstreminder.add(new reminder("Exams",R.drawable.exams));
        lstreminder.add(new reminder("Holidays",R.drawable.holidays));
        lstreminder.add(new reminder("Medical",R.drawable.medical));
        lstreminder.add(new reminder("Purchase",R.drawable.purchase));
        lstreminder.add(new reminder("Travel",R.drawable.travel));
        lstreminder.add(new reminder("Shows",R.drawable.shows));

    RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.mRecyclerView_id);
    RecyclerviewAdapter recyclerviewAdapter = new RecyclerviewAdapter(getActivity(),lstreminder);
    recyclerviewAdapter.setOnItemClickListner(new RecyclerviewAdapter.onItemClickListner() {
        @Override
        public void onClick(reminder str) {

        }
    });
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),3));
    recyclerView.setAdapter(recyclerviewAdapter);

    return rootView;
}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

public interface OnFragmentInteractionListener {
    void onFragmentInteraction(Uri uri);
}

}

图片

在 switch case 中,我想根据适配器的位置打开新的片段。

是否可以请指导我解决,或者如果我走错路请指导我...

【问题讨论】:

  • 获取callback 到活动并在那里执行片段事务。
  • 片段可以显示在视图容器(如活动)或另一个片段中,您的目标视图是什么?是新活动还是活动的一部分?
  • @FahedYasin 新活动
  • 请关注@Android Team 的回答。这是处理点击的正确方法

标签: android android-recyclerview android-cardview


【解决方案1】:

在回收器视图适配器中制作接口,如下代码..

onItemClickListner onItemClickListner;

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner {
    void onClick(String str);//pass your object types.
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    // below code handle click event on recycler view item.
    String data=mStringList.get(position);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
}

你的代码..

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

private Context mContext;
private List<reminder> mData;

onItemClickListner onItemClickListner;

public void setOnItemClickListner(onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner {
    void onClick(reminder str);//pass your object types.
}
public RecyclerviewAdapter(Context mContext, List<reminder> mData) {
    this.mContext = mContext;
    this.mData = mData;
}

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

    View view;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    view = inflater.inflate(R.layout.cardview, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    reminder data=mData.get(position);
    holder.mTextView.setText(mData.get(position).getmTitle());
    holder.mImageView.setImageResource(mData.get(position).getmImages());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
}

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

public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView mTextView;
    ImageView mImageView;

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

        mTextView = (TextView) itemView.findViewById(R.id.mReminder_Text_Id);
        mImageView = (ImageView) itemView.findViewById(R.id.mReminder_Image_Id);
    }
}

}

然后在定义适配器值并绑定到回收器视图调用下面的代码之后.. 在将适配器绑定到回收器视图时的活动中。

       recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
       @Override
       public void onClick(String str) {
           // here call your fragment 

       }
   });

您的片段代码..

public class Reminders extends Fragment {

    private OnFragmentInteractionListener mListener;
    List<reminder> lstreminder;

    public Reminders() {

    }

    public static Reminders newInstance(String param1, String param2) {
        Reminders fragment = new Reminders();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
        }
    }

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

            lstreminder = new ArrayList<>();
            lstreminder.add(new reminder("Alarm",R.drawable.alarms));
            lstreminder.add(new reminder("Birthday",R.drawable.birthdays));
            lstreminder.add(new reminder("Anniversary",R.drawable.anniversaries));
            lstreminder.add(new reminder("Buy Gifts",R.drawable.buygift));
            lstreminder.add(new reminder("Bill Payments",R.drawable.billpayments));
            lstreminder.add(new reminder("Call / SMS",R.drawable.call));
            lstreminder.add(new reminder("Recharges",R.drawable.recharges));
            lstreminder.add(new reminder("Meetings",R.drawable.meetings));
            lstreminder.add(new reminder("Insurance",R.drawable.insurances));
            lstreminder.add(new reminder("Exams",R.drawable.exams));
            lstreminder.add(new reminder("Holidays",R.drawable.holidays));
            lstreminder.add(new reminder("Medical",R.drawable.medical));
            lstreminder.add(new reminder("Purchase",R.drawable.purchase));
            lstreminder.add(new reminder("Travel",R.drawable.travel));
            lstreminder.add(new reminder("Shows",R.drawable.shows));

        RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.mRecyclerView_id);
        RecyclerviewAdapter recyclerviewAdapter = new RecyclerviewAdapter(getActivity(),lstreminder);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),3));
        recyclerView.setAdapter(recyclerviewAdapter);
        recyclerviewAdapter.setOnItemClickListner(new RecyclerviewAdapter.onItemClickListner() {
            @Override
            public void onClick(reminder str) {
                // here str is click item value in recyclerview.
                // here perform your operation . str is give object reminder pojo class of selected item on recyclerview. 

    // below code you can make condition and check any value.
    if(str.getItemName().equals("xyz")){
        Fragment fragment = new MainFragment();// here give your fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
    }
    else if(str.getItemName().equals("ayx")){
        Fragment fragment = new HomeFragment();// here give your fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

    }


               recyclerviewAdapter.notifyDataSetChanged();

            }
        });
        return rootView;
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(Uri uri);
    }

}

【讨论】:

    【解决方案2】:

    试试这样:

    public class NewAdapter extends RecyclerView.Adapter<NewAdapter.MyViewHolder> {
        Context context;
        LayoutInflater inflater;
        Activity activity;
        View view;
        RecyclerView recyclerViewNew;
        private ArrayList<reminder> mData;
    
        public NewAdapter(RecyclerView recyclerView, Context context, ArrayList<reminder>
                mData, Activity activity) {
            this.context = context;
            this.mData = mData;
            this.activity = activity;
            inflater = LayoutInflater.from(this.context);
            this.recyclerViewNew = recyclerView;
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_cases_fragment, parent, false);
    
            MyViewHolder sectionViewHolder = new MyViewHolder(view);
            return sectionViewHolder;
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            final int pos = position;
            holder.mTextView.setText(mData.get(position).getmTitle());
            holder.mImageView.setImageResource(mData.get(position).getmImages());
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = view.getContext();
                    Intent intent = new Intent();
                    switch (pos) {
                        case 0:
                            AppCompatActivity activity = (AppCompatActivity) view.getContext();
                            Fragment myFragment = new MyFragment();
                            activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
                            break;
                    }
    
                }
            });
        }
    
        @Override
        public int getItemCount() {
            return mData.size();
        }
    
        public static class MyViewHolder extends RecyclerView.ViewHolder {
    
            TextView mTextView;
            ImageView mImageView;
            CardView cardView;
    
            public MyViewHolder(View itemView) {
                super(itemView);
    
                mTextView = (TextView) itemView.findViewById(R.id.mReminder_Text_Id);
                mImageView = (ImageView) itemView.findViewById(R.id.mReminder_Image_Id);
                cardView = (CardView) itemView.findViewById(R.id.cardView);
            }
        }
    }
    

    希望对你有所帮助。

    【讨论】:

    • 不要将整个适配器放入您的代码中并检查缺少的内容。希望这可以帮助你。无需创建新的另一个适配器。
    • 如果您没有存档,请稍后再接再厉。 @Nikson 也可以参考:- gist.github.com/riyazMuhammad/1c7b1f9fa3065aa5a46f
    • @Nikson 更新答案查看并再次检查是否已解决?
    • 得到这个错误错误:类 Recyclerview Adapter 中的构造函数 Recyclerview Adapter 不能应用于给定类型;必需:RecyclerView,Context,ArrayList,Activity found: FragmentActivity,List 原因:实际参数列表和正式参数列表长度不同
    • 好的 @Nikson 太好了,我昨天为你准备了一个关于这个的演示,无论如何你已经完成了很好......快乐的编码。
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多