【问题标题】:Pass data from RecyclerView Adapter to Parent Fragment将数据从 RecyclerView Adapter 传递给 Parent Fragment
【发布时间】:2016-08-28 17:18:12
【问题描述】:

我有一个带有用于查找内容的 EditText 和一个 RecyclerView 的屏幕。

EditText 可以在我的网络服务器中找到

RecyclerView 显示最常用的标签

所以,我想做的是,当用户单击 RecyclerView 列表的任何元素时 选择的值将传递给 editText。

我有一个片段,它膨胀了显示所有内容的文件:

tags_list.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="org............BuscarFragment">   
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@android:drawable/ic_menu_search"
        android:hint="@string/busqueda"
        android:inputType="textVisiblePassword"
        android:lines="1"
        android:singleLine="true" />

    <TextView
        android:id="@+id/buscar_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/inputSearch" />


    <TextView
        android:id="@+id/etiquetas_populares"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/buscar_msg"
        android:layout_marginLeft="16dp"
        android:text="@string/etiquetas_populares"/>

    <android.support.v7.widget.RecyclerView       xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/tags_list"
        android:name="org............TagsFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/etiquetas_populares"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        app:layoutManager="LinearLayoutManager"
        tools:context="org...........activities.TagsActivity"
        tools:listitem="@layout/tags_list_content" />

</RelativeLayout>

</FrameLayout>

TagsFragment.java 我有这个方法:

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

        view = inflater.inflate(R.layout.tags_list, container, false);

        //RecyclerView Section
        mRecyclerView = (RecyclerView) view.findViewById(R.id.tags_list);
        mBuscarTagsAdapter = new BuscarTagsAdapter(getActivity(), tagMoreUsedRecyclerViewList);

        mRecyclerView.setAdapter(mBuscarTagsAdapter);


        addKeyListener();
        return view;
    }

终于在我的适配器中。

BuscarTagsAdapter.java

 @Override
    public void onBindViewHolder(final BuscarTagsViewHolder holder, int position) {


        final int posicion = position;


        //onClick for the list
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //When the user click I want to pass this value to my EditText, but
                //I don't see how to do it from this Adapter

                Toast.makeText(context, tags.get(posicion).getTagName(), Toast.LENGTH_SHORT).show();

            }
        });
    }

有什么想法吗? 谢谢

更新和解决:

您好,@Brian Nam,感谢您的帮助。

做了一些改动。 按照您的建议,首先在构造函数中:

    public BuscarTagsAdapter(Context context, List<TagMoreUsedRecyclerView> items, TagsListInterface tagsListInterface) {

            this.context = context;
            this.tags = items;
            this.tagsListInterface = tagsListInterface;

}

但是 tagsListInterface 在 TagsFragment 中没有正确初始化, 所以我在 onCreate 方法中添加了这个:

 tagsListInterface = new TagsListInterface() {
            @Override
            public void onTagClicked(String tagName, int posicion) {
                EditText editText = (EditText) view.findViewById(R.id.inputSearch);
                editText.setText(tagName);
            }
        };

最后在 onClick 中找到 RecyclerView:

BuscarTagsAdapter.java

 @Override
    public void onBindViewHolder(final BuscarTagsViewHolder holder, int position) {

        final int posicion = position;
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(context, tags.get(posicion).getTagName(), Toast.LENGTH_SHORT).show();
                tagsListInterface.onTagClicked(tags.get(posicion).getTagName(), posicion);


            }
        });
    }

【问题讨论】:

  • 您可以将片段传递给适配器,并且在适配器中您可以使用要从片段传递的值调用方法。

标签: android android-fragments android-recyclerview android-edittext android-adapter


【解决方案1】:

不幸的是,没有“好的”方法可以做到这一点。我想说的是,您应该查看事件总线实现之一,而不是接口,例如 Greenrobot 的 EventBus。

https://github.com/greenrobot/EventBus

使用 EventBus(基本上是发布者-订阅者模式)之类的东西的好处是您可以省去很多匿名类、接口,但也可以减少代码耦合。更不用说任何类都可以订阅事件,所以你基本上可以说“用户做了这个”并且多个片段可以对它做出反应。如果您制作复杂的 UI/动画内容,这将特别有用。

EventBus 的坏处是您开始遇到很多事件代码质量受损,并且有时很难知道发生了什么以及发生在哪里。

但正如我所说,没有“好的”方法可以做到这一点,这就是 android 框架的工作方式。

【讨论】:

    【解决方案2】:

    正如@Brian Nam 所写,您可以将对TagsFragment 实例的引用传递给您的BuscarTagsAdapter

    一个类似但 IMO 更“干净”的解决方案是创建一个接口,例如:

    public interface TagsListInterface {
        void onTagClicked(String tagName);
    }
    

    然后您的TagsFragment 将实现该接口并将其实例传递给BuscarTagsAdapter。然后,当单击 Recycler View 的元素时,您将调用该接口的 onTagClicked 方法。

    另一种解决方案是通过您的 Activity 将 RecyclerView 与您的 Fragment 进行通信,我相信它是最“类似于 Android”的一个。它还可能涉及创建自定义接口,但实现它的是 Activity 而不是 Fragment。你可以阅读更多关于它的信息here。这篇文章解释了如何在片段之间进行通信,但我相信它可以向您展示总体思路,以便您可以将其应用于您的情况。

    更新:

    在您正在调用的onCreateView 方法中:

    mBuscarTagsAdapter = new BuscarTagsAdapter(getActivity(), tagMoreUsedRecyclerViewList);
    

    您唯一需要在这里更改的是更新BuscarTagsAdapter 的构造函数以接收TagsListInterface 的实例,然后从TagsFragment 传递您的实现。然后,您可以在单击元素时使用它调用onTagClicked

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2021-05-12
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多