2017-07-06 8 views
1

私は編集テキストとリサイクラビューを持っていますが、編集テキストの目的は入力をリストのフィルタとして使用することです。ここに私のコードは次のとおりです。Recyclerビューがフィルタでリフレッシュされない - ArrayAdapter

フラグメント:

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

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

     mountain.customwidgets.MontserratRegularAutoComplete editStationSearch = 
       (mountain.customwidgets.MontserratRegularAutoComplete) 
         view.findViewById(R.id.autoCompleteSource); 

     editStationSearch.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mAdapter.getFilter().filter(s); 

      } 
     }); 


     RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     CsvReaderImpl csvReader = new CsvReaderImpl(); 
     stationNameCodePojoArrayList = csvReader.ReadFromfile("data/stations.txt", getActivity()); 

     mAdapter = new StationsRecyclerAdapter(getActivity(),stationNameCodePojoArrayList); 
     mRecyclerView.setAdapter(mAdapter); 

     LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 

     mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL) { 
      @Override 
      public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 
       // Do not draw the divider 
      } 
     }); 

     return view; 

    } 

ここでは私のアダプタクラスです:

public class StationsRecyclerAdapter extends RecyclerView.Adapter<StationsRecyclerAdapter.DataObjectHolder> implements Filterable { 

    private ArrayList<StationPojo> mDataset; 
    private StationTextFilter stationTextFilter; 
    private Context ctx; 

    public StationsRecyclerAdapter(Context ctx, ArrayList<StationPojo> myDataset) { 
     this.mDataset = (new ArrayList<>(myDataset)); 
     this.ctx = ctx; 
     for (int i = 0; i < mDataset.size(); i++) { 
      System.out.println("mDatasset Original: " + Arrays.asList(mDataset.get(i).getStationName())); 
     } 
    } 

    @Override 
    public Filter getFilter() { 
     if (stationTextFilter == null) { 
      stationTextFilter = new StationTextFilter(this, mDataset); 
     } 
     return stationTextFilter; 
    } 

    @Override 
    public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View mView = LayoutInflater.from(ctx).inflate(R.layout.row_auto_complete, parent, false); 
     return new DataObjectHolder(mView); 
    } 

    public static class DataObjectHolder extends RecyclerView.ViewHolder { 
     TextView stationName; 
     TextView stationCode; 
     TextView stationElevation; 


     public DataObjectHolder(View itemView) { 
      super(itemView); 
      stationName = (TextView) itemView.findViewById(R.id.textStationName); 
      stationCode = (TextView) itemView.findViewById(R.id.textStationCode); 
      stationElevation = (TextView) itemView.findViewById(R.id.textStationElevation); 
     } 
    } 

    @Override 
    public void onBindViewHolder(DataObjectHolder holder, int position) { 
     holder.stationCode.setText(mDataset.get(position).getStationCode()); 
     holder.stationElevation.setText(mDataset.get(position).getStationElevation()); 
     holder.stationName.setText(mDataset.get(position).getStationName()); 

    } 

    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return super.getItemViewType(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

} 

そしてここでは、Filterクラスです:

​​

私はかなり確信しています私はフィルタリングされた結果を印刷することができるので、事はmDataset.addAll((ArrayList<StationPojo>) filterResults.values);までうまく動作します。何とか私はなぜnotifyDを知ることができませんatasetChangedは機能しません!どんな見出し?

+0

基底クラスとして[この(https://gist.github.com/pskink/cd3bbdd742b5b1905a790c76831b5d85)を使用し、その 'マッチ() 'メソッドは、このようなオーバーライド:'クラスAが延びるMatchableRVArrayAdapter {... ' – pskink

+0

あなたが投稿したコードを調べる必要があります。間違いなくそれに従います! – User3

答えて

1

AdapterArrayListを参照していて、StationTextFilterのものではないためです。 mDatasetがあなたのアダプタでArrayListを参照し、実際のですここ

public StationTextFilter(StationsRecyclerAdapter adapter, List<StationPojo> mDataset) { 
     super(); 
     this.adapter = adapter; 
     this.mDataset = new ArrayList<>(mDataset); 
     this.filteredList = new ArrayList<>(); 
    } 

参照してください、しかし、ここであなたのnotifyDataSetChangedには反映されませんので、全く新しいArrayListを作成しています。

これを解決する1つの方法は、新しいArrayListを作成せずにそのまま使用することです。

this.mDataset = mDataset; 
+0

私は両方の方法で試しましたが、何も変わりません! – User3

+0

@ User3あなたのフィルターは機能しますか?あなたはそれの内容をチェックしましたか? –

+0

はい、私はフィルターを得ることができます!私が私の元の質問で述べたように。 – User3

関連する問題