recyclerview过滤器在filteres之后选择上一个元素数据

agxfikkp  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(226)

我用onquerytextchange方法过滤我的recyclerview数据,过滤器工作正常,但是当我点击一个又一个过滤器上的元素时,它仍然会拾取放置在过滤器前的元素。有人能指出我做错了什么吗。
主活动.java

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener
 {

    List<DataAdapter> DataAdapterClassList;

    RecyclerView recyclerView;

     EditText etSearch;

    RecyclerView.LayoutManager recyclerViewlayoutManager;

    RecyclerViewAdapter recyclerViewadapter;

    ProgressBar progressBar;

    JsonArrayRequest jsonArrayRequest;

    ArrayList<String> BankNames;

    RequestQueue requestQueue;

    String HTTP_SERVER_URL = "http://hiddenforsecurity.com?method=apiTest";

    View ChildView;

    int RecyclerViewClickedItemPOS;

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

     private static int firstVisibleInListview;

     @Override
    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;
     }

 }

回收服务适配器.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();
    }

}

请看这些截图,以便更好地理解我的查询。
当我单击过滤器前的项目时,toast会显示正确的数据。未过滤的屏幕截图
当我在过滤后单击一个项目时,toast仍然显示上面屏幕截图中的数据,这里应该显示hdfc bank.filtered屏幕截图

yizd12fk

yizd12fk1#

这是因为您正在列表视图中更改数据集,但稍后在您引用的toast中更改数据集 BankNames 这是不同的数据集。
在您的示例中,由于过滤器,列表只有一个元素。当你点击它的时候,点击的索引实际上是0,而不是你所需要的x,然后你从索引银行中选择0 BankNames 不是来自筛选的结果集。
要正确处理问题,请对列表视图和数据获取使用相同的数据集。你可以通过创建 filteredBankNames 集合,并将其传递给列表视图。同时,在单击事件中,从 filteredBankNames 以及取代 BankNames 例如:

// make this not final local variable, but a field in activity so you can remember filtered items
     final List<DataAdapter> filteredModelList = filter(DataAdapterClassList, newText);
     if (filteredModelList.size() > 0) {
         recyclerViewadapter.setFilter(filteredModelList);
         return true;
     } else {

Toast ```
Toast.makeText(MainActivity.this, filteredModelList.get(RecyclerViewClickedItemPOS), Toast.LENGTH_SHORT).show();

相关问题