A B
A B

Reputation: 33

Recyclerview Loadmore Not Working After Search

Past Few days,Facing this problem .RecyclerView onscroll to Loadmore and EditText Search works fine.But When i search data and Get Respective Result List and Then if I Scroll RecyclerView then Loadmore not working .

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

Here is EndlessRecyclerOnScrollListener

I am new in Android-studio .Does any guys meet this issue?Any help would be greatly appreciated.

Upvotes: 0

Views: 623

Answers (1)

beeb
beeb

Reputation: 1615

The problem is that you're losing your reference where you want to add your items. Your current steps are:

  1. Create list in mainactivity ArrayList<Student> mDataSet = new ArrayList();
  2. Create adapter in mainactivty and pass my_Dataset (my_Dataset is mDataSet) mAdapter = new RecyclerAdapter(my_Dataset);
  3. Init adapter (you save the reference of mDataSet here) mDataset = dataset; mCleanCopyDataset = mDataset;
  4. Filter mDataset = new ArrayList<Student>(); here you lose your reference

Solution

Rename mDataset to mFilteredDataSet inside your adapter and change your constructor like that:

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
}

Change mDataset = new ArrayList<Student>(); in your filter function to mFilteredDataset.clear()

Don't forget to call mAdapter.filter() at the end of your loadMoreData() because you add more data to your adapter but the new added data is not included in your filtered list.

Upvotes: 1

Related Questions