繁体   English   中英

Recyclerview 使用 SearchView 过滤后出现错误 position

[英]Recyclerview Getting wrong position after filtering using SearchView

单击过滤结果后,我无法获得正确的 Recyclerview position:

如果用户搜索第二个结果并单击它,应用程序将使用第一个结果而不是第二个结果向他发送下一个活动(标签活动)。

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


} 

这是(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;
    }
   

}

我修复了我的代码中的一些错误。 它工作..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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