【问题标题】:Fragment retrieve data from recycler view片段从回收器视图中检索数据
【发布时间】:2018-02-01 18:59:23
【问题描述】:

这是我的RecyclerView 的适配器。它旨在将数据从RecyclerView 传递给我的Fragment,但我无法通过onClick() 方法做到这一点。

itemView.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View v) {

       Bundle bundle = new Bundle();
       bundle.putString("name",name.getText().toString() );
       OneFragment myFrag = new OneFragment();
       myFrag.setArguments(bundle);
}

我的片段

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    txt_name=(TextView) txt_name.findViewById(R.id.name_emp);
    String name = getArguments().getString("name");
    txt_name.setText(name);
}

【问题讨论】:

  • 我们不能通过适配器OneFragment直接调用fragment myFrag = new OneFragment();首先你必须调用片段的 Activity ,我已经编辑了我的答案检查@joker_7

标签: android fragment android-recyclerview


【解决方案1】:

我不确定你打算做什么。但是在你将一个bundle设置到一个fragment之后,你必须使用这样的事务来启动fragment

 getSupportFragmentManager().beginTransaction().add(<id of the container>, myFrag).commit();

查看fragments上的文档

【讨论】:

    【解决方案2】:

    像下面的代码一样,为你的 Activity 创建一个方法,你有片段:

    Recyclerview 适配器代码:

    itemView.setOnClickListener(new View.OnClickListener() {
    
    @Override
    public void onClick(View v) {
        ((MainActivity)context).sendData(name.getText().toString());
    }
    

    在 MainActivity 中获取 String 并从 Activity 调用 Fragment :

    MainActivity 代码:

     String name;
    
     public void sendData(String nameAdapter)
    {
        name = nameAdapter;
        if(name!=null){
            MedicineFragment med_frag = MedicineFragment.newInstance(name);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.content_frame, med_frag)
                    .commit();
        }
    
    }
    

    像这样在片段中获取名称的名称:

    片段代码:

    String name;
    
    public static MedicineFragment newInstance(String nameValue) {
    
        Bundle args = new Bundle();
        MedicineFragment fragment = new MedicineFragment();
        name = nameValue;
        fragment.setArguments(args);
        return fragment;
    }
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    

    在您的 main_activity.xml 中,您必须采用 FrameLayout ,只有通过这种布局,您的片段才会更改为另一个。

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/search_layout"
            android:background="@color/blue_veryLight"
            android:id="@+id/content_frame">
        </FrameLayout>
    

    【讨论】:

    • 什么是 content_frame !!
    • 在你的activity.xml里面你必须带@joker_7,我已经编辑了我的代码请检查
    • viewpager 会取代 FrameLayout 吗?
    • 不,你必须向 ViewPager Activity 的 Fragment 发送数据,对吗?
    • 首先将数据发送到您已完成 TabActivity 代码的活动,然后发送到片段。试试这个stackoverflow.com/a/46828366/8448886
    【解决方案3】:

    我知道我迟到了。不过,我会在这里发布答案。

    在您的适配器类中进行这些更改。

    public class FooAdapter extends extends RecyclerView.Adapter<FooAdapter.FooHolder> {
    
        private RvClickListener mClickListener;
        ......
        // rest of the code here
        ......
    
        public FooAdapter(<other parameters>, RvClickListener clickListener) {
           .....
           // other variables initializations here
           .....
           mClickListener = clickListener;
        }
    
        ......
        // rest of the code here
        ......
    
        @Override
        public void onBindViewHolder(FooHolder holder, int position) {
           // rest of the code
    
          holder.itemView.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (mClickListener != null) {
                            mClickListener.onClick(name.getText().toString());
                        }
                    }
                });
        }
    
        // other codes here
    
        public interface RvClickListener {
            void onClick(String name);
        }
    
    }
    

    现在是时候在我们的 Fragment 类中使用适配器了。您需要更改代码如下。

    public class FooFragment extends Fragment {
    
      // other codes here
    
      // before setting adapter to RecyclerView make these changes.
    
        FooAdapter adapter = new FooAdapter(
                                        <other parameters>,
                                         new RvClickListener() {
                                            @Override
                                              public void onClick(String name) {
                                                 // do whatever you want
                                              }
                                      });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2022-10-26
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多