繁体   English   中英

将数据从RecyclerView适配器传递到父片段

[英]Pass data from RecyclerView Adapter to Parent Fragment

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

要在我的Web服务器中找到EditText

RecyclerView显示了最受欢迎的标签

因此,我想做的是,当用户单击RecyclerView List的任何元素时,所选值将传递给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);


            }
        });
    }

不幸的是,没有“好的”方法来做到这一点。 我要说的不是接口,而是应该从Greenrobot检出事件总线实现之一,例如EventBus。

https://github.com/greenrobot/EventBus

使用诸如EventBus之类的东西(基本上是发布者-订阅者模式)的好处是,您可以节省很多匿名类,接口,但是还可以减少代码的耦合。 更不用说任何类都可以订阅事件,因此您基本上可以说“用户做到了”,并且多个片段可以对此做出反应。 如果您执行复杂的UI /动画操作,则此功能特别有用。

关于EventBus的坏处是,您开始遇到很多事件,导致代码质量下降,有时很难知道会发生什么情况以及在哪里发生。

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

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

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

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

然后,您的TagsFragment将实现该接口,并将其实例传递给BuscarTagsAdapter 然后,当单击“回收者视图”的元素时,将调用该接口的onTagClicked方法。

另一个解决方案是通过您的Activity与您的Fragment交流RecyclerView,据我所知,Activity是最“类似于Android”的。 它还可能涉及创建自定义接口,但是由Activity来实现而不是Fragment。 您可以在此处了解更多信息。 本文介绍了如何在片段之间进行通信,但是我相信它可以向您展示总体思路,因此可以将其应用于实际情况。

更新:

onCreateView方法中,您将调用:

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

你必须改变这里的唯一一件事就是更新的构造BuscarTagsAdapter接收的实例TagsListInterface ,然后通过从实施TagsFragment 然后,您可以使用它在单击元素时调用onTagClicked

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM