简体   繁体   中英

Recyclerview Getting wrong position after filtering using SearchView

I'm unable to get right Recyclerview position after clicking to the filtered result:

If a user searched for the 2nd result and he click it, the app will send him the next activity (Tags activity) using the 1st result instead for the 2nd result.

Here is (CategorieAdapter.java):

public class CategorieAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {


    private Context mContext;
    private List<Categorie> mCategorie ;
    private List<Categorie> mCategoriefull ;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    public CategorieAdapter(Context mContext, List<Categorie> mCategorie) {

        this.mContext = mContext;
        this.mCategorie = mCategorie;
        this.mCategoriefull=mCategorie;
        this.mInflater = LayoutInflater.from(mContext);
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View menuItemLayoutView ;
        
        menuItemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.categorie_view, parent, false);
        return new MenuItemViewHolder(menuItemLayoutView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position ) {
        MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
        menuItemHolder.title.setText(((Categorie)mCategorie.get(position)).getName().trim());
        menuItemHolder.cid.setText(String.valueOf(mCategorie.get(position).getId()));


    }



    @Override
    public long getItemId(int position) {
        return mCategorie.get(position).getId();
    }

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

    public class MenuItemViewHolder  extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView title,cid;

        public MenuItemViewHolder (View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title) ;
            cid=(TextView) itemView.findViewById(R.id.cid);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null)
            {
                mClickListener.onItemClick(view, getAdapterPosition());

            }
        }
    }

    // convenience method for getting data at click position
    public Object getItem(int id) {
        return mCategorie.get(id);
    }

    // allows clicks events to be caught
    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }

    @Override
    public int getItemViewType(int position){
        return 1;
    }

//filter

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }


    private Filter exampleFilter = new Filter(){
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String charString = constraint.toString();

            if (charString.isEmpty()){
                mCategorie = mCategoriefull;
            }else{

                List<Categorie> filterList = new ArrayList<>();

                for (Categorie data : mCategoriefull){

                    if (data.getName().toLowerCase().contains(charString)){
                        filterList.add(data);
                    }
                }

                mCategorie = filterList;

            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = mCategorie;

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
           mCategorie = (List<Categorie>) results.values;
            notifyDataSetChanged();
        }
    };


} 

Here is (MainActivity.java):

public class MainActivity extends AppCompatActivity implements CategorieAdapter.ItemClickListener {

    RecyclerView categoriesListView;
    CategorieAdapter adapter;
    List<Categorie> mCategories =new ArrayList<>();
    Categorie categories;
    boolean doublepresstoexit = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        categoriesListView = (RecyclerView)findViewById(R.id.categories);
        categoriesListView.setHasFixedSize(true);
       
        initToolbar();
        getData();
        
    }


    @Override
    public void onItemClick(View view, int position) {
        
            Intent intent = new Intent(MainActivity.this, TagsActivity.class);
            intent.putExtra("id_cat", mCategories.get(position).getId());
            intent.putExtra("title", mCategories.get(position).getName());
            startActivityForResult(intent, 1);
            
       
    }


    @Override
    public void onBackPressed() {
        if (doublepresstoexit) {
            super.onBackPressed();
            return;
        }
        this.doublepresstoexit = true;
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                doublepresstoexit=false;
            }
        },2000);
    }



    private void initToolbar() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
       setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(null);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }


    //get data from server 

    private void getData() {

        StringRequest stringRequest=new StringRequest(Request.Method.GET, SettingsClass.URL_GETCAT, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray jsonArray=new JSONArray(response);
                    for(int i=0;i<jsonArray.length();i++)
                    {
                        JSONObject object=jsonArray.getJSONObject(i);
                        String id=object.getString("id_cat");
                        String name=object.getString("name");

                        int c=Integer.parseInt(id);
                        categories=new Categorie(c,name);

                        mCategories.add(categories);
                      
                        adapter=new CategorieAdapter(MainActivity.this,mCategories);
                        categoriesListView.setAdapter(adapter);
                        adapter.setClickListener(MainActivity.this::onItemClick);
                        adapter.notifyDataSetChanged();

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
               
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, "error"+error, Toast.LENGTH_SHORT).show();
                
            }
        });
        RequestQueue requestQueue= Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

   
    //search

     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_basic, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);

        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);

         searchView.setMaxWidth(Integer.MAX_VALUE);
         searchView.setOnCloseListener(new SearchView.OnCloseListener() {
             @Override
             public boolean onClose() {
                 searchView.clearFocus();
                 return false;
             }
         });
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return true;
            }
        });

        return true;
    }
   

}

i fixed some bugs in my code. And it work..

 private Filter exampleFilter = new Filter(){
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            ArrayList<Categorie> filterList = new ArrayList<>();

            if (constraint.toString().isEmpty())
            {

                filterList.addAll(mCategoriefull);
            }
            else
                {
                for (Categorie data : mCategoriefull)
                {

                    if (data.getName().toString().toLowerCase().contains(constraint.toString().toLowerCase())){
                        filterList.add(data);
                    }
                }

            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filterList;
            return filterResults;

        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mCategorie.clear();
           mCategorie.addAll((ArrayList<Categorie>)results.values);
            notifyDataSetChanged();
        }
    };

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