2017-07-06 76 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; 
    } 

} 

这里是过滤器类:

​​

我敢肯定,事情工作正常,直到mDataset.addAll((ArrayList<StationPojo>) filterResults.values);,因为我可以打印过滤结果,不知何故,我不知道为什么notifyD atasetChanged不起作用!任何标题?

+0

使用[此](https://gist.github.com/pskink/cd3bbdd742b5b1905a790c76831b5d85)作为基类并覆盖其'匹配()'方法,是这样的:'类A延伸MatchableRVArrayAdapter {...' – pskink

+0

我将不得不通过您发布的代码。一定会跟着它! – User3

回答

1

因为您的Adapter引用了另一个ArrayList而不是您的StationTextFilter中的那个。看到这里

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

mDataset是引用您的适配器ArrayList实际的,但在这里你正在创建一个全新的ArrayList,因而没有得到反映在您的notifyDataSetChanged

解决此问题的一种方法是不创建新的ArrayList并按原样使用它。

this.mDataset = mDataset; 
+0

我已经尝试过这两种方式,但没有改变! – User3

+0

@ User3你的过滤器是否工作?你检查过它的内容吗? –

+0

是的,我可以得到过滤器!正如我在原来的问题中提到的那样。 – User3