2017-07-06 47 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