【问题标题】:Open a new fragment and pass data when click on my Recycler CardView Grid?单击我的 Recycler CardView Grid 时打开一个新片段并传递数据?
【发布时间】:2016-04-12 07:33:57
【问题描述】:

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

Android Grid Image

我想点击例如冠军亚托克斯(第一个网格)并打开一个带有亚托克斯信息的新片段。其他英雄联盟冠军也是如此。

我知道它在 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();}

}

【问题讨论】:

标签: android android-fragments android-studio android-recyclerview android-cardview


【解决方案1】:

首先你应该像往常一样将 RecyclerView 嵌入到一个片段中,我们称之为ChampionOverviewFragment

现在您应该有一个 SingleChampionFragment 和一个静态 newInstance 方法,该方法接受构建冠军信息所需的所有内容作为参数(例如带有您的冠军 id 的字符串)。当我们点击您卡片视图中的一张卡片时,我们希望打开此片段。

您的活动现在只有一个 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));
}

如果您还需要回栈导航,请参阅我在另一个答案中链接的教程。

【讨论】:

    【解决方案2】:

    以下是关于如何在片段之间进行通信的一般方法,因此它也应该适用于您的问题。

    将 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 类。

    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//
    }
    

    这是以最简单的方式实现片段间通信的方式。希望这可以帮助! 干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-02
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多