【问题标题】:How to pass or send data from recyclerview adapter to fragment如何将数据从 recyclerview 适配器传递或发送到片段
【发布时间】:2018-10-16 07:05:02
【问题描述】:

如何将数据从 recyclerview 适配器传递到片段以及我必须在片段中编写代码以接收数据。我已经检查了该网站中的链接,但遗憾的是无法获得正确的代码。 下面是代码

ExampleAdapter.Java

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
    private ArrayList<ExampleItem> mExampleList;
    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item,viewGroup,false);
        ExampleViewHolder evh=new ExampleViewHolder(v);
        return evh;
    }
    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, int i) {
        final ExampleItem currentItem=mExampleList.get(i);
        exampleViewHolder.mTextView.setText(currentItem.getmText());
        exampleViewHolder.mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // pass the data to the fragment
            }
        });
    }
    @Override
    public int getItemCount() {
        return mExampleList.size();
    }
    public static class ExampleViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ExampleViewHolder(@NonNull View itemView) {
            super(itemView);
            mTextView=itemView.findViewById(R.id.texttitle);
        }
    }
    public ExampleAdapter(ArrayList<ExampleItem> exampleList){
              this.mExampleList=exampleList;
}
}

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    您可以通过将回调附加到适配器来传递数据:

    创建界面

    interface OnTextClickListener {
        void onTextClick(ExampleItem data);
    }
    

    委托回调

    class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
    
        List<ExampleItem> items;
        OnTextClickListener listener;
    
        ExampleAdapter(List<ExampleItem> items, OnTextClickListener listener) {
            this.items = items;
            this.listener = listener;
        }
    
        @Override
        public void onBindViewHolder(ExampleViewHolder viewHolder, int position) {
            viewHolder.textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Say you want to pass an ExampleItem back to the fragment...
                    ExampleItem data = items.get(position);
                    listener.onTextClick(data);
                }
            });
        }
    }
    

    用接口实现片段

    class YourFragment extends Fragment implements OnTextClickListener {
    
        public onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            recyclerView.setAdapter(new ExampleAdapter(this));
        }
    
        void onTextClick(ExampleItem data) {
            // Now you can do however you want with the data here...
            Toast.makeText(getActivity(), "Got: " + data, Toast.LENGTH_SHORT).show()
        }
    }
    

    【讨论】:

    • Adapter 的 listener.onTextClick(...) 和 Fragment 中的 void onTextClick(Object data) { // 从适配器接收的数据 } 中写什么
    • @mohammednabil 你可以在listener.onTextClick() 中传递任何你想要的作为参数,然后你可以在稍后的回调onTextClick() 中处理数据。我已经更新了我的答案,希望对您有所帮助!
    • 谢谢,很好很简单:)
    【解决方案2】:

    你有两个选择;

    使用SharedPreferences

    Context myContext = exampleViewHolder.itemView.getContext()
    
    SharedPreferences.Editor editor = getSharedPreferences("DeviceToken", MODE_PRIVATE).edit();
    editor.putString("YourKeyNameHere", currentItem.getmText()); // or add toString() after if needed
    editor.apply();
    

    获取:

    SharedPreferences prefs = getSharedPreferences("DeviceToken", MODE_PRIVATE);
    String deviceToken = prefs.getString("YourKeyNameHere", null); // get it here
    

    使用Intent:(如果你想在传递数据时启动另一个Activity

    Intent intent = new Intent(myContext , SignoutActivity.class);
    intent.putExtra("EXTRA_TEXT", currentItem.getmText());
    startActivity(intent); // if needed, add myContext before starting myContext.startActivity...
    

    获取:

    String extraText = getIntent().getStringExtra("EXTRA_TEXT");
    

    【讨论】:

    • 它在 ExampleAdapter.java 和 Fragment.java 中显示“无法解析方法 getsharedreferences(java.lang.String, int)
    • 第二个参数是int,所以如果你使用currentItem.getmText(),就像我说的,在后面加上toString()。像这样:currentItem.getmText().toString()
    • 在输入 current.getmText().toString(); 后显示同样无法解析方法 getsharedreference(java.lang.String,int);
    【解决方案3】:

    片段中有“ClickListener”。

    例如。

    @Override
    public void onResume(){
        super.onResume();
        ((ExampleAdapter) mAdapter).onItemClick(new RecyclerViewItemClick() {
            @Override
            public void onItemClick(int position, View v) {
                //to do. ArrayList<> data.get(position).getYourItem();
            }
        });
    }
    

    而且你必须创建接口 RecyclerViewItemClick.java

    public interface RecyclerViewItemClick {
        public void onItemClick(int position, View v);
    }
    

    最后。 ExampleAdapter.java 添加

    public void onItemClick(RecyclerViewItemClick mclick){
       this.myClickListener = mclick;
    }
    

    ExampleViewHolder 方法添加

    @Override
    public void onClick(View v) {
        myClickListener.onItemClick(getAdapterPosition(), v);
        notifyDataSetChanged();
    }
    

    希望你能解决这个问题。谢谢。

    【讨论】:

      【解决方案4】:

      有一个IDataCollector 接口。在Fragment 中实现她,将Fragment 引用作为构造函数参数传递,并在适配器内部使用它

      public interface IDataCollector {
          void setText(String text);
          void setAnything(Object anything);
      }
      
      // Fragment
      
      public class Fragment implements IDataCollector {
      
          private void initView() {
              // Add this as a parameter
              ExampleAdapter adapter = new ExampleAdapter(... , this);
          }
      
          @Override
          public void setText(String text){
              this.textField = text;
          }
      
          @Override
          public void setText(Object anything){
              this.anything = anything;
          }
      }
      
      // Adapter code
      
      // Constructor, parameters ommited
      public ExampleAdapter(...., IDataCollector dataCollector) {
          this.dataCollector = dataCollector;
      }
      
      @Override
      public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, int i) {
          final ExampleItem currentItem=mExampleList.get(i);
          exampleViewHolder.mTextView.setText(currentItem.getmText());
          exampleViewHolder.mTextView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  dataCollector.setText(((TextView)v.findViewById(R.id.label1)).getText());
                  ....
              }
          });
      }
      

      【讨论】:

        【解决方案5】:

        通过接口你可以解决这个问题 1.在adapter中创建一个接口,添加需要的方法 2. 在需要的地方调用适配器中的这些方法 3.在fragment或activity中实现接口,将上下文传递给适配器

        【讨论】:

        • 接口中需要哪2个方法以及如何在fragment中实现接口。
        猜你喜欢
        • 1970-01-01
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多