您好我需要帮助才能在我的Recycler CardView Grid上点击时打开一个新片段并传递数据。
我想点击冠军Aatrox(第一个网格)并用AatroxInformatión打开一个新片段。与英雄联盟的其他冠军一样。
我知道这是在onClick函数中,但我不知道该怎么做。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setClickable(true);
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
}
});
这是我完整的ChampAdapter.java
public class ChampAdapter extends RecyclerView.Adapter<ChampAdapter.ViewHolder> {
public List<ChampionItemModel> champItem;
public ChampAdapter(List<ChampionItemModel> champItem){this.champItem = champItem;}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView champName;
TextView roleChamp;
ImageView champImg;
public ViewHolder(View itemView) {
super(itemView);
this.champName = (TextView)itemView.findViewById(R.id.champ_name);
this.roleChamp = (TextView)itemView.findViewById(R.id.champ_role);
this.champImg = (ImageView)itemView.findViewById(R.id.champ_image);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_champs,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setClickable(true);
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
}
});
holder.champName.setText(champItem.get(position).champName);
holder.roleChamp.setText(champItem.get(position).roleChamp);
holder.champImg.setImageResource(champItem.get(position).champImg);
}
@Override
public int getItemCount() { return champItem.size();}
}
答案 0 :(得分:1)
首先,您应该像往常一样将RecyclerView嵌入到片段中,让我们称之为ChampionOverviewFragment
。
现在你应该拥有一个带有静态newInstance方法的SingleChampionFragment
,该方法接受构建冠军信息所需的所有参数(例如一个冠军头衔的字符串)。当我们点击你的cardview中的一张卡片时,我们想要打开这个片段。
您的活动现在只有一个HostFragment,您在其onCreate方法中使用ChampionOverviewFragment
填充。请参阅我的答案,了解如何创建nested fragments。
你的onClick方法现在看起来像这样:
@Override
public void onClick(View v){
((MainActivity) holder.itemView.getContext()).openChampionFragment(holder.getChampionId);
}
当然,您的MainActivity必须包含以下方法:
public void openChampionFragment(String id)
this.hostFragment.replaceFragment(SingleChampionFragment.newInstance(id));
}
如果您还需要后台导航,请参阅我在其他答案中链接的教程。
答案 1 :(得分:0)
以下是关于如何在片段之间进行通信的一般方法,因此它也适用于您的问题。
将recyclerView放入片段中。
我假设你能够获得适配器的位置。将recyclelerview放入片段调用RV中,它的响应将在片段中显示为RVvalues。您使用名为PassRVValues
的接口RV片段中的代码:
public class RV extends Fragment{
int RVposition;
PassRVValues passRVValues;
//
your code for recyclerview and other things
//
RVposition = position_value_obtained;
passRVValues.sendToOtherFragment(RVposition);
这是接口的代码。创建一个只有接口的新java类。
public interface PassRVValues{
sendToOtherFragment(int value_from_RVFragment);
}
活动中的代码
public class MainActivity implements PassRVValues{
//
some code
//
@Override
public void sendToOtherFragment(int use_value_from_RVFragment){
//
Do something with data if you want
//
RVvalues Frag = (RVValues)getFragmentManager().findFragmentById(R.id.rvvalues);
Frag.ShowDataBasedOnPositionInRV(something_based_from_any_process_in_sendToOtherFragment_Method);
}
现在查看RVValues片段中的代码
public class RVValues extends Fragment{
//again any codes//
public void ShowDataBasedOnPositionInRV(int data_based_on_RV_position){
//do something//
}
这是以最简单的方式实现片段间通信的方法。希望这可以帮助! 干杯!