从 RecyclerView 单击 CardView 加载片段

Posted

技术标签:

【中文标题】从 RecyclerView 单击 CardView 加载片段【英文标题】:Load a fragment on clicking CardView from RecyclerView 【发布时间】:2015-05-23 21:41:31 【问题描述】:

我有一个 RecyclerViewCardView 在里面。现在我要做的是在单击 CardView 时加载一个简单的Fragment。我无法使用 FragmentManager 或 SupportFragmentManager 做到这一点。请给我一些指示。

我的 RecyclerViewAdapder 和 ViewHolder 是 ..

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> 
    private String[] eventName;
    private String[] eventBrief;

    public static class ViewHolder extends RecyclerView.ViewHolder 

        public TextView textViewName, textViewBrief;
        public CardView cardView;

        public ViewHolder(View v) 
            super(v);

            textViewName = (TextView)v.findViewById(R.id.textViewName);
            textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
            final Context context = v.getContext();
            cardView = (CardView)v.findViewById(R.id.card_view);

            cardView.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View view) 
                    EventFragment eventFragment = EventFragment.newInstance();
                    // Load and view eventFragment here??
                
            );
        
    

    public RecyclerViewAdapter(String[] eventName, String[] eventBrief) 
        this.eventName = eventName;
        this.eventBrief = eventBrief;

    

    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) 
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_card_view, parent, false);
        return new ViewHolder(v);
    

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) 
        holder.textViewName.setText(eventName[position]);
        holder.textViewBrief.setText(eventBrief[position]);
    

    @Override
    public int getItemCount() 
        return eventName.length;
    

【问题讨论】:

【参考方案1】:

一个简单的实现是在Adapter的构造函数中将onClickListener()添加到ViewHolderitemView

    public MyViewHolder(View view) 
        super(view);

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

                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment myFragment = new MyFragment();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();


            
        );
    

【讨论】:

@martiendt @viper Fragment myFragment = new MyFragment(); 是什么? MyFragment 是你要加载的片段的片段类@sabbibJAVA @sabbibJAVA 你可以在这里看到我的实现github.com/martiendt/daily-dhamma我在github.com/martiendt/daily-dhamma/blob/master/app/src/main/java/…上使用了这个【参考方案2】:

我无法使用 FragmentManager 或 支持片段管理器

这是因为RecyclerViewAdapter 不包含对FragmentManager 的引用。您应该与托管 RecyclerView 的 Activity/Fragment 进行通信,告知该事件已发生,并从那里开始该片段。为此请检查我的答案here

【讨论】:

【参考方案3】:

真的有很多方法可以解决这个问题。我觉得最好的实现是对活动的回调,通知项目已被单击。我会给你一些代码,见下文:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> 
private String[] eventName;
private String[] eventBrief;
private OnItemClickListener listener;

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 

    public TextView textViewName, textViewBrief;
    public CardView cardView;
    private OnItemClickListener listener;

    public ViewHolder(View v, OnItemClickListener listener) 
        super(v);

        textViewName = (TextView)v.findViewById(R.id.textViewName);
        textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
        final Context context = v.getContext();
        cardView = (CardView)v.findViewById(R.id.card_view);

        cardView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                if(listener!=null)
                   listener.onItemClick(textViewName.getText().toString(),
         textViewBrief.getText().toString();
            
        );
    


public RecyclerViewAdapter(String[] eventName, String[] eventBrief) 
    this.eventName = eventName;
    this.eventBrief = eventBrief;


@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) 
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_card_view, parent, false);
    return new ViewHolder(v);


@Override
public void onBindViewHolder(ViewHolder holder, int position) 
    holder.textViewName.setText(eventName[position]);
    holder.textViewBrief.setText(eventBrief[position]);
    holder.setOnItemClickListener(listener);


@Override
public int getItemCount() 
    return eventName.length;


public void setOnItemClickListener(OnItemClickListener listener)
    this.listener = listener


public interface OnItemClickListener 
       public void onItemClick(String textName, String textViewBrief); 
     
   

然后在你的活动中像这样实例化它:

RecyclerViewAdapter adapter = new RecyclerViewAdapter(eventName, eventBrief);
adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener()
        public void onItemClick(String textName, String textViewBrief)
            EventFragment eventFragment = EventFragment.newInstance();
            //replace content frame with your own view.
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    ft.replace(R.id.content_frame, eventFragment).commit()
       
);

【讨论】:

以上是关于从 RecyclerView 单击 CardView 加载片段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 fire-base 检索数据到新活动中单击 RecyclerView

使用 Volley / RecyclerView 从按钮单击的 JSON 中提取新信息

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

单击 RecyclerView 时显示附加信息

单击 Recyclerview 中的项目后,OnItem 单击无法正常工作

即使滚动RecyclerView,也可以启用单击项目