单击我的 Recycler CardView Grid 时打开一个新片段并传递数据?
Open a new fragment and pass data when click on my Recycler CardView Grid?
您好,我需要帮助打开一个新片段并在单击我的 Recycler CardView Grid 时传递数据。
我想点击冠军 Aatrox(第一格),然后打开一个带有 Aatrox Informatió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();}
}
首先,您应该像往常一样将 RecyclerView 嵌入片段中,我们称它为 ChampionOverviewFragment
。
现在您应该有一个 SingleChampionFragment
和一个静态 newInstance 方法,该方法接受构建冠军信息所需的一切作为参数(例如,带有冠军 ID 的字符串)。我们希望在您的卡片视图中单击其中一张卡片时打开此片段。
您的 activity 现在只有一个 HostFragment,您可以在其 onCreate 方法中使用 ChampionOverviewFragment
填充它。请参阅我关于如何创建 .
的回答
您的 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));
}
如果你还需要后台导航,请参考我在其他答案中链接的教程。
以下是片段间通信的一般方法,应该也适用于您的问题。
将 recyclerView 放在片段中。
我假设您能够获得适配器的位置。将 recyclerview 放在片段调用 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 class。
public interface PassRVValues{
sendToOtherFragment(int value_from_RVFragment);
}
activity
中的代码
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//
}
这是实现inter-fragment通信最简单的方式。希望这可以帮助!
干杯!
您好,我需要帮助打开一个新片段并在单击我的 Recycler CardView Grid 时传递数据。
我想点击冠军 Aatrox(第一格),然后打开一个带有 Aatrox Informatió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();}
}
首先,您应该像往常一样将 RecyclerView 嵌入片段中,我们称它为 ChampionOverviewFragment
。
现在您应该有一个 SingleChampionFragment
和一个静态 newInstance 方法,该方法接受构建冠军信息所需的一切作为参数(例如,带有冠军 ID 的字符串)。我们希望在您的卡片视图中单击其中一张卡片时打开此片段。
您的 activity 现在只有一个 HostFragment,您可以在其 onCreate 方法中使用 ChampionOverviewFragment
填充它。请参阅我关于如何创建
您的 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));
}
如果你还需要后台导航,请参考我在其他答案中链接的教程。
以下是片段间通信的一般方法,应该也适用于您的问题。
将 recyclerView 放在片段中。
我假设您能够获得适配器的位置。将 recyclerview 放在片段调用 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 class。
public interface PassRVValues{
sendToOtherFragment(int value_from_RVFragment);
}
activity
中的代码 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//
}
这是实现inter-fragment通信最简单的方式。希望这可以帮助! 干杯!