简体   繁体   中英

Setting the dataset for Recyclerview after filter

I am filtering my data using onQueryTextChange, the list filters but it still shows the old data set(unfiltered) which results in data from the old list, even though it shows the new filtered list.

Can someone fix my code which will display the right data set after filter, and unfiltered dataset when the a user will clear the search text.

I will explain it better with screenshots. Before filter Screenshot 1 , clicking on a item will toast the text on it.

After Filter Screenshot 2 , on click it is supposed to say HDFC BANK, instead it still shows the data from Position 1 from the unfiltered data set.

I was told its because I am using the BankNames List (unfiltered) text at position when clicking, because of which this is happening.

Can someone please fix my logic here, I am unable to figure this out, even though it seems simple, I am new to Android.

MainActivity.java

    public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener
 {

    List<DataAdapter> DataAdapterClassList;

    RecyclerView recyclerView;

     final List<DataAdapter> filteredModelList = new ArrayList<>();

    RecyclerView.LayoutManager recyclerViewlayoutManager;

    RecyclerViewAdapter recyclerViewadapter;

    ProgressBar progressBar;

    JsonArrayRequest jsonArrayRequest;

    ArrayList<String> BankNames;

    RequestQueue requestQueue;

    String HTTP_SERVER_URL = "http://hiddenforsecurity.com";

    View ChildView;

    int RecyclerViewClickedItemPOS;

    LinearLayout lyt, icicBtn, hdfcBtn, axisBtn, sbiBtn, pnbBtn, yesBtn;

     private static int firstVisibleInListview;

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


        DataAdapterClassList = new ArrayList<>();

        BankNames = new ArrayList<>();

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView1);

        progressBar = (ProgressBar) findViewById(R.id.progressBar1);

        recyclerView.setHasFixedSize(true);

        recyclerViewlayoutManager = new LinearLayoutManager(this);

        recyclerView.setLayoutManager(recyclerViewlayoutManager);

        lyt = (LinearLayout) findViewById(R.id.Layout1);

        final Intent go = new Intent(MainActivity.this, StateList.class);


        icicBtn = (LinearLayout) findViewById(R.id.icicBtn);
        hdfcBtn = (LinearLayout) findViewById(R.id.hdfcBtn);
        axisBtn = (LinearLayout) findViewById(R.id.axisBtn);
        sbiBtn = (LinearLayout) findViewById(R.id.sbiBtn);
        pnbBtn = (LinearLayout) findViewById(R.id.pnbBtn);
        yesBtn = (LinearLayout) findViewById(R.id.yesBtn);

        final Intent i = new Intent(this, StateList.class);


        // JSON data web call function call from here.
        JSON_WEB_CALL();

        //RecyclerView Item click listener code starts from here.
        recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {

            GestureDetector gestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() {

                @Override
                public boolean onSingleTapUp(MotionEvent motionEvent) {

                    return true;
                }

            });

            @Override
            public boolean onInterceptTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {

                ChildView = Recyclerview.findChildViewUnder(motionEvent.getX(), motionEvent.getY());

                if (ChildView != null && gestureDetector.onTouchEvent(motionEvent)) {

                    //Getting RecyclerView Clicked item value.
                    RecyclerViewClickedItemPOS = Recyclerview.getChildAdapterPosition(ChildView);
                    Toast.makeText(MainActivity.this, BankNames.get(RecyclerViewClickedItemPOS), Toast.LENGTH_SHORT).show();
                    //Printing RecyclerView Clicked item clicked value using Toast Message.
                    //i.putExtra("selectedbank", BankNames.get(RecyclerViewClickedItemPOS));
                    //startActivity(i);

                }

                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView Recyclerview, MotionEvent motionEvent) {

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });

        icicBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "ICICI BANK LIMITED");
                startActivity(go);
            }
        });

        axisBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "AXIS BANK");
                startActivity(go);
            }
        });

        hdfcBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "HDFC BANK");
                startActivity(go);
            }
        });

        sbiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "STATE BANK OF INDIA");
                startActivity(go);
            }
        });
        pnbBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "PUNJAB NATIONAL BANK");
                startActivity(go);
            }
        });
        yesBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go.putExtra("selectedbank", "YES BANK");
                startActivity(go);
            }
        });

    }


    public void JSON_WEB_CALL(){

        progressBar.setVisibility(View.VISIBLE);

        jsonArrayRequest = new JsonArrayRequest(HTTP_SERVER_URL,

                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {

                        JSON_PARSE_DATA_AFTER_WEBCALL(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

        requestQueue = Volley.newRequestQueue(this);

        requestQueue.add(jsonArrayRequest);
    }

    public void JSON_PARSE_DATA_AFTER_WEBCALL(JSONArray array){

        for(int i = 0; i<array.length(); i++) {

            DataAdapter GetDataAdapter2 = new DataAdapter();

            JSONObject json = null;
            try {
                json = array.getJSONObject(i);


                GetDataAdapter2.setBankName(json.getString("BANK"));

                //Adding subject name here to show on click event.
                BankNames.add(json.getString("BANK"));

            }
            catch (JSONException e)
            {

                e.printStackTrace();
            }

            DataAdapterClassList.add(GetDataAdapter2);

        }

        progressBar.setVisibility(View.GONE);

        recyclerViewadapter = new RecyclerViewAdapter(DataAdapterClassList, this);

        recyclerView.setAdapter(recyclerViewadapter);

    }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.menu_search, menu);

         MenuItem item = menu.findItem(R.id.action_search);
         SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

         searchView.setOnQueryTextListener(this);

         return super.onCreateOptionsMenu(menu);
     }

     @Override
     public boolean onQueryTextSubmit(String query) {
         return false;
     }

     @Override
     public boolean onQueryTextChange(String newText) {


         final List<DataAdapter> filteredModelList = filter(DataAdapterClassList, newText);
         if (filteredModelList.size() > 0) {
             recyclerViewadapter.setFilter(filteredModelList);
             return true;
         } else {
             Toast.makeText(MainActivity.this, "Not Found", Toast.LENGTH_SHORT).show();
             return false;
         }

     }

     private List<DataAdapter> filter(List<DataAdapter> models, String query) {
         query = query.toLowerCase();

         final List<DataAdapter> filteredModelList = new ArrayList<>();
         for (DataAdapter model : models) {
             final String text = model.getBankName().toLowerCase();
             if (text.contains(query)) {
                 filteredModelList.add(model);
             }
         }

         recyclerViewadapter = new RecyclerViewAdapter(filteredModelList, MainActivity.this);
         recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
         recyclerView.setAdapter(recyclerViewadapter);
         recyclerViewadapter.notifyDataSetChanged();
         return filteredModelList;
     }

 } 

RecyclerviewAdapter.java

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

    Context context;

    public DataAdapter dataAdapter;

    List<DataAdapter> dataAdapters;

    public RecyclerViewAdapter(List<DataAdapter> getDataAdapter, Context context){

        super();

        this.dataAdapters = getDataAdapter;
        this.context = context;
    }



    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);

        return viewHolder;
    }


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

        dataAdapter =  dataAdapters.get(position);

        viewHolder.TextViewName.setText(dataAdapter.getBankName());

    }

    @Override
    public int getItemCount() {

        return dataAdapters.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        public TextView TextViewName;

        public ViewHolder(View itemView) {
            super(itemView);
            TextViewName = (TextView) itemView.findViewById(R.id.TextViewCard) ;

        }
    }

    public void setFilter(List<DataAdapter> bankNames) {
        dataAdapters = new ArrayList<>();
        dataAdapters.addAll(bankNames);
        notifyDataSetChanged();
    }
} 

Make global variable for filteredList and take data from that list. The error happened because you are toasting from the full list. Not filteredList

Try this

may this issue that your are Printing Toast of BankNames.get(RecyclerViewClickedItemPOS) from your Oldlist not From the filteredModelList

Remove this

//Getting RecyclerView Clicked item value.
  RecyclerViewClickedItemPOS = Recyclerview.getChildAdapterPosition(ChildView);
  Toast.makeText(MainActivity.this, BankNames.get(RecyclerViewClickedItemPOS), Toast.LENGTH_SHORT).show();

and set Toast in Adapter class

viewHolder.TextViewName..setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 Toast.makeText(context,  dataAdapter.getBankName(), Toast.LENGTH_SHORT).show();
            }
        });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM