点击我的Recycler CardView网格,打开一个新片段并传递数据?

时间:2016-01-07 19:03:34

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

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

Android Grid Image

我想点击冠军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();}

}

2 个答案:

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

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