从 RecyclerView 单击 CardView 加载片段
Posted
技术标签:
【中文标题】从 RecyclerView 单击 CardView 加载片段【英文标题】:Load a fragment on clicking CardView from RecyclerView 【发布时间】:2015-05-23 21:41:31 【问题描述】:我有一个 RecyclerView
和 CardView
在里面。现在我要做的是在单击 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()
添加到ViewHolder
的itemView
。
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 @viperFragment 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 项目中实现单击