[英]Getting wrong position after Recyclerview filtering using SearchView
[英]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.