2016-08-28 18 views
2

コンテンツとRecyclerViewを見つけるためのEditTextの画面があります。RecyclerViewアダプタから親フラグメントにデータを渡す

のEditTextが

私のウェブサーバーにRecyclerViewを見つけることですが、そう

を使用される最も人気のあるタグを示し、私は何をしたいユーザーはRecyclerViewリストの要素のいずれかをクリックすると、ある その値がeditTextに渡されます。

@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; 
    } 

<?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が、私はこの方法を持っている

tags_list.xml:

私はすべてのものを表示し、ファイルを膨らませるの断片を持っています

最後に私のアダプターで。

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ナム、助けに感謝を。

いくつか変更を加えました。あなたが示唆したようにコンストラクタの最初の :

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

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

} 

をしかしtagsListInterfaceはTagsFragment、 に正しく初期化されていないので、私はのonCreateメソッドでこれを追加しました:

:RecyclerViewためのonClickで最後に

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

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); 


      } 
     }); 
    } 
+0

フラグメントをアダプタに渡すことができ、アダプタでは、フラグメントから渡す値でメソッドを呼び出すことができます。 –

答えて

1

@Brian Namが書いたように、TagsFragmentインスタンスへの参照をBuscarTagsAdapterに渡すことができます。

似ていますが、IMOもう少し「クリーン」ソリューションは、インターフェイス例えばを作成することです。:

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

その後、あなたのTagsFragmentインターフェイスを実装し、BuscarTagsAdapterへのインスタンスを渡します。次に、Recycler Viewの要素がクリックされたときに、そのインターフェイスのonTagClickedメソッドを呼び出します。

もう一つの解決策は、RecyclerViewをあなたのアクティビティを介してあなたのフラグメントと通信することです。これは、私が信じるように、最もAndroidに似たものです。また、カスタムインターフェイスを作成することもできますが、これはFragmentの代わりに実装するアクティビティです。あなたはそれについての詳細を読むことができますhere。この記事では、フラグメント間の通信を行う方法について説明しますが、あなたの状況に適用できるように一般的なアイデアを示すことができると信じています。

更新:あなたが呼び出しているonCreateView方法で

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

あなたがここに変更する必要が唯一のものはTagsListInterfaceのインスタンスを受信し、合格するBuscarTagsAdapterのコンストラクタを更新することです実装はTagsFragmentです。次に、要素をクリックすると、onTagClickedを呼び出すことができます。

2

残念ながら、これを行うには良い方法はありません。インターフェイスの代わりに、GreenBotのEventBusのようなイベントバスの実装の1つをチェックアウトする必要があります。

https://github.com/greenrobot/EventBus

EventBus(基本的には、パブリッシャ - サブスクライバパターン)のようなものを使用しての良いところは、あなたが匿名クラス、インタフェースの多くを割いていますが、コードが少なく結合させることです。言うまでもなく、どのクラスもイベントに登録できるので、基本的に「ユーザーはこれを行いました」と言って、複数のフラグメントがそれに反応することができます。これは、複雑なUI /アニメーションを行う場合に特に便利です。

EventBusの悪い点は、多くのイベントコードの品質に苦しみ、時には何が起きているのかを知ることが難しいことです。

しかし、私が言ったように、これを行うための「良い」方法はありません。アンドロイドフレームワークの仕組みだけです。

関連する問題