单击我的 Recycler CardView Grid 时打开一个新片段并传递数据?

Open a new fragment and pass data when click on my Recycler CardView Grid?

您好,我需要帮助打开一个新片段并在单击我的 Recycler CardView Grid 时传递数据。

Android Grid Image

我想点击冠军 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通信最简单的方式。希望这可以帮助! 干杯!