2017-02-27 39 views
0

過去幾天,面臨這個問題。 RecyclerView onloadroll到Loadmore和EditText搜索工作正常。但當我搜索數據,並獲得各自的結果列表,然後如果我滾動RecyclerView然後Loadmore無法正常工作。Recyclerview Loadmore搜索後不工作

MainActivity

public class MainActivity extends FragmentActivity { 

    private RecyclerView mRecyclerView; 

    private LinearLayoutManager mLayoutManager; 
    private EditText editsearch; 
    private RecyclerAdapter mAdapter; 

    private int ival = 1; 
    private int loadLimit = 10; 

    ArrayList<Student> mDataSet = new ArrayList(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ArrayList<Student> my_Dataset = getDataSet(); 
     mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     mRecyclerView.setHasFixedSize(true); 

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

     mAdapter = new RecyclerAdapter(my_Dataset); 
     mRecyclerView.setAdapter(mAdapter); 

     editsearch = (EditText) findViewById(R.id.et_search); 

     // add the listener for EditText 
     editsearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable arg0) { 

      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, 
              int arg2, int arg3) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
       String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); 
       mAdapter.filter(text); 
      } 
     }); 

     mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(
       mLayoutManager) { 
      @Override 
      public void onLoadMore(int current_page) { 

       loadMoreData(); 

      } 

     }); 

    } 

    private ArrayList<Student> getDataSet() 
    { 

     for (int i = 1; i <=10; i++) 
     { 
      Student std=new Student(); 
      std.setName("Root" + i); 
      mDataSet.add(std); 
     } 
     return mDataSet; 
    } 

    private void loadMoreData() { 

     loadLimit = ival +5; 

     for (int i = ival; i <= loadLimit; i++) { 
      Student st = new Student("Student " + i,false); 
      mDataSet.add(st); 
      ival++; 
     } 

     mAdapter.notifyDataSetChanged(); 

    } 
} 

RecyclerAdapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 

    private ArrayList<Student> mDataset; 
    private ArrayList<Student> mCleanCopyDataset; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView mTextView; 

     public ViewHolder(View v) { 
      super(v); 
      mTextView = (TextView) v.findViewById(R.id.tv_recycler_item); 
     } 
    } 

    public RecyclerAdapter(ArrayList<Student> dataset) { 
     mDataset = dataset; 
     mCleanCopyDataset = mDataset; 
    } 

    @Override 
    public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.recycler_item, parent, false); 

     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     holder.mTextView.setText(mDataset.get(position).getName()); 

    } 

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

    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     mDataset = new ArrayList<Student>(); 
     if (charText.length() == 0) { 
      mDataset.addAll(mCleanCopyDataset); 
     } else { 
      for (Student item : mCleanCopyDataset) { 
       /* if (item.toLowerCase(Locale.getDefault()).contains(charText)) { 
        mDataset.add(item); 
       }*/ 
       if(item.getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
        mDataset.add(item); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 
} 

這裏是EndlessRecyclerOnScrollListener

我在Android的工作室是新.Does任何人符合這個問題?任何幫助將是偉大的y讚賞。

回答

0

問題是,你失去了你的參考,你想添加你的項目。您當前的步驟是:

  1. 在mainactivity ArrayList<Student> mDataSet = new ArrayList();
  2. 在mainactivty創建適配器,並通過my_Dataset(my_Dataset是mDataSet)創建列表 mAdapter = new RecyclerAdapter(my_Dataset);
  3. 初始化適配器(您節省mDataSet這裏的參考) mDataset = dataset; mCleanCopyDataset = mDataset;
  4. 過濾器mDataset = new ArrayList<Student>();這裏你失去你的參考

解決方案

重命名mDatasetmFilteredDataSet您轉接器內,並改變你的構造類似:

public RecyclerAdapter(ArrayList<Student> dataset) { 
    mFilteredDataset = new ArrayList<>(); // init your filtered dataset just one time and clear it on filtering 
    mFilteredDataset.addAll(dataset); // here you have your copy of the dataset 
    mCleanCopyDataset = dataset; // this is your reference of the complete dataset 
} 

變化mDataset = new ArrayList<Student>();在你的過濾功能 到 mFilteredDataset.clear()

不要忘記調用mAdapter.filter()loadMoreData()的末尾,因爲您向適配器添加了更多數據,但新增的數據不包含在您的f中過濾列表。

+0

您的回答可能是完美的。您可以發送給我code.I新手 – Kankana

+0

只需按照我的解決方案說明。它包含您必須添加/更改的所有代碼。如果您不明白解決方案的某些問題,請隨時提問。 – beeb

+0

我是新手。你可以發送演示示例。 – Kankana