【问题标题】:Passing data from RecyclerView to Fragment?将数据从 RecyclerView 传递到 Fragment?
【发布时间】:2021-05-12 06:01:36
【问题描述】:

我目前正在创建一个应用程序,它由一个片段、一个用于 RecyclerView 的适配器和一个通过片段访问的 RecyclerView 组成。我需要将数据从 RecyclerView 传递回片段,但是我无法这样做,因为片段没有通过 Intent 识别。当用户从 RecyclerView 中选择一个项目时,这个项目应该被传递给片段。我使用 onBackPressed() 使用 RecyclerView 导航回工作正常的片段,但是似乎没有数据通过。请看下面我目前拥有的:

CustomAdapter.java

    private OnItemClickListener mOnItemClickListener;

    public interface OnItemClickListener{
          public void onItemClick(View view, int position);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
         holder.text1.setText(String.valueOf(text1.get(position)));
         holder.text2.setText(String.valueOf(text2.get(position)));
         holder.text3.setText(String.valueOf(text3.get(position)));

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mOnItemClickListener.onItemClick(v, holder.getAdapterPosition());
        }
    });
}

InputToFragment.java

        @Override
        public void onItemClick(View view, int position) {
            // Need to pass data through to Fragment, however unable to do so as it's not identified
            // within the Intent
            onBackPressed();
        }
    });

片段.java

       // Nothing related to Passing data within the Fragment

【问题讨论】:

    标签: java android-studio android-fragments android-recyclerview android-arrayadapter


    【解决方案1】:

    它适合你的片段

    YourFragment : Fragment() {
        OnItemClickListener listener = new OnItemClickListener(){
            @Override
             public void onItemClick(View view, int position){
                 //this called if item at adapter clicked
             }
        }
    
      ....
       //whatever lifecycle you choose for initialize adapter
       onCreateView(){
           adapter = new YourAdapter(listener);
       }
    
       public interface OnItemClickListener{
              public void onItemClick(View view, int position);
       }
    
    }
    

    这个给你的适配器

    private OnItemClickListener listener; 
    
    YourConstructorAdapter(OnItemClickListener listener){
       this.listener = listener;
    }
    
     @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
         holder.text1.setText(String.valueOf(text1.get(position)));
         holder.text2.setText(String.valueOf(text2.get(position)));
         holder.text3.setText(String.valueOf(text3.get(position)));
    
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // this code calling method from fragment
            listener.onItemClick(v, position);
        }
    });
    

    我强烈建议迁移到 kotlin 并使用高阶函数,它非常简单。

    【讨论】:

      【解决方案2】:

      你可以使用界面,这里是怎么做的

      创建处理点击的接口:-

      public interface OnCustomItemSelectListener {
          void onCustomItemSelected(String data);
      }
      

      不要在你的片段或活动中扩展它:-

      public class MyActivity implements OnCustomItemSelectListener {
          @Override
          public void onCustomItemSelected(String data) {
              /*store it if neede */
              /* additional code */
          }
      
      }
      

      在回收站视图中将此活动传递给回收站视图构造函数,在您的自定义适配器中,您可以将此活动分配给侦听器接口,并从覆盖的 onClick() 调用 onCustomItemSelected 方法,该方法将在您之前的活动或片段中。

      OnCustomItemSelectListener itemSelectListener;
      public CustomAdapter(Activity listenerAct, .....){
        this.itemSelectListener = listenerAct;
      }
      
      
             
      
      
      
      @Override
       public void onClick(View view)  
       {  
          itemSelectListener.onCustomItemSelected(data);  
       }  
      

      这会将数据传递给您的片段/活动中的 onCustomItemSelected() 方法

      【讨论】:

      • 感谢您的评论,不幸的是我仍然无法完成,无论如何我们可以用我目前拥有的东西以及我需要什么来简化它以使数据传递工作?
      • 也许这可以帮助你stackoverflow.com/questions/39420496/…。这是我提到的相同概念,但我猜它可以帮助您更好地理解这个想法
      猜你喜欢
      • 2021-05-11
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多