【问题标题】:Load a fragment on clicking CardView from RecyclerView从 RecyclerView 单击 CardView 加载片段
【发布时间】:2015-05-23 21:41:31
【问题描述】:

我有一个 RecyclerViewCardView 在里面。现在我要做的是在单击 CardView 时加载一个简单的Fragment。我无法使用 FragmentManager 或 SupportFragmentManager 做到这一点。请给我一些指示。

我的 RecyclerViewAdapder 和 ViewHolder 是 ..

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private String[] eventName;
    private String[] eventBrief;

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewName, textViewBrief;
        public CardView cardView;

        public ViewHolder(View v) {
            super(v);

            textViewName = (TextView)v.findViewById(R.id.textViewName);
            textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
            final Context context = v.getContext();
            cardView = (CardView)v.findViewById(R.id.card_view);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    EventFragment eventFragment = EventFragment.newInstance();
                    // Load and view eventFragment here??
                }
            });
        }
    }

    public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
        this.eventName = eventName;
        this.eventBrief = eventBrief;

    }

    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_card_view, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textViewName.setText(eventName[position]);
        holder.textViewBrief.setText(eventBrief[position]);
    }

    @Override
    public int getItemCount() {
        return eventName.length;
    }
}

【问题讨论】:

    标签: android fragment android-recyclerview android-cardview


    【解决方案1】:

    一个简单的实现是在Adapter的构造函数中将onClickListener()添加到ViewHolderitemView

        public MyViewHolder(View view) {
            super(view);
    
            itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view){
    
                    AppCompatActivity activity = (AppCompatActivity) view.getContext();
                    Fragment myFragment = new MyFragment();
                    activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
    
    
                }
            });
        }
    

    【讨论】:

    【解决方案2】:

    我无法使用 FragmentManager 或 支持片段管理器

    这是因为RecyclerViewAdapter 不包含对FragmentManager 的引用。您应该与托管 RecyclerView 的 Activity/Fragment 进行通信,告知该事件已发生,并从那里开始该片段。为此请检查我的答案here

    【讨论】:

      【解决方案3】:

      真的有很多方法可以解决这个问题。我觉得最好的实现是对活动的回调,通知项目已被单击。我会给你一些代码,见下文:

      public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
      private String[] eventName;
      private String[] eventBrief;
      private OnItemClickListener listener;
      
      public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
      
          public TextView textViewName, textViewBrief;
          public CardView cardView;
          private OnItemClickListener listener;
      
          public ViewHolder(View v, OnItemClickListener listener) {
              super(v);
      
              textViewName = (TextView)v.findViewById(R.id.textViewName);
              textViewBrief = (TextView)v.findViewById(R.id.textViewBrief);
              final Context context = v.getContext();
              cardView = (CardView)v.findViewById(R.id.card_view);
      
              cardView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      if(listener!=null)
                         listener.onItemClick(textViewName.getText().toString(),
               textViewBrief.getText().toString();
                  }
              });
          }
      }
      
      public RecyclerViewAdapter(String[] eventName, String[] eventBrief) {
          this.eventName = eventName;
          this.eventBrief = eventBrief;
      }
      
      @Override
      public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                     int viewType) {
          View v = LayoutInflater.from(parent.getContext())
                  .inflate(R.layout.my_card_view, parent, false);
          return new ViewHolder(v);
      }
      
      @Override
      public void onBindViewHolder(ViewHolder holder, int position) {
          holder.textViewName.setText(eventName[position]);
          holder.textViewBrief.setText(eventBrief[position]);
          holder.setOnItemClickListener(listener);
      }
      
      @Override
      public int getItemCount() {
          return eventName.length;
      }
      
      public void setOnItemClickListener(OnItemClickListener listener){
          this.listener = listener
      }
      
      public interface OnItemClickListener {
             public void onItemClick(String textName, String textViewBrief); 
          } 
      }   
      

      然后在你的活动中像这样实例化它:

      RecyclerViewAdapter adapter = new RecyclerViewAdapter(eventName, eventBrief);
      adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener(){
              public void onItemClick(String textName, String textViewBrief){
                  EventFragment eventFragment = EventFragment.newInstance();
                  //replace content frame with your own view.
                  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();    ft.replace(R.id.content_frame, eventFragment).commit()
             }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多