在GridView中过滤列表后,索引改变,item上下文错误



我有一个GridList View,我正在从firebase传递数据。当我点击项目,它工作得很好,没有过滤,但当我过滤它与searchView然后它不更新列表的索引,然后提供不同的项目的上下文。

我不知道如何在过滤时更新条目。

首页。活动

package com.project.quizapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.cardview.widget.CardView;
import android.app.SearchManager;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.GridView;
import android.widget.ListAdapter;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import java.util.ArrayList;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static com.project.quizapp.LogIn.catList;
import static com.project.quizapp.LogIn.selected_cat_index_app;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.project.quizapp.CatGridAdapter;
public class HomePage extends AppCompatActivity {
CatGridAdapter adapter;
private GridView catGrid;
private FirebaseFirestore firebasefirestore;
public static List<CategoryModelClass> resultData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_page);
//Binding view and adding toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Subjects");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(HomePage.this, dashActivity.class));
}
});
//Adapter to set all the views
catGrid = findViewById(R.id.catGridview);
adapter = new CatGridAdapter(catList);
catGrid.setAdapter(adapter);

}

//Filtering all tthe views
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflating all the views and filtering
getMenuInflater().inflate(R.menu.search, menu);
MenuItem menuitem = menu.findItem(R.id.searchMenu);
SearchView searchview = (SearchView) menuitem.getActionView();
searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Calling filters on the search attempt
//adapter.getFilter().filter(newText);
resultData = new ArrayList<>();
for(CategoryModelClass categoryModelClass:catList){
if(categoryModelClass.getName().toLowerCase().contains(newText.toLowerCase())){
resultData.add(categoryModelClass);
}
adapter = new CatGridAdapter(resultData);
catGrid.setAdapter(adapter);

}
return true;
}
});
return true;
}
//Adding search icon to the toolbar
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if(id == R.id.searchMenu){
return true;
}
return super.onOptionsItemSelected(item);
}
}

CatGridAdapter.java

package com.project.quizapp;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static com.project.quizapp.LogIn.selected_cat_index_app;
import static java.security.AccessController.getContext;
//Creating the adapter wih the default BaseAdapter
//Also implementing
public class CatGridAdapter extends BaseAdapter {

//List of all the class variables
private List<CategoryModelClass> catList;
//Initializing the list wih constructor
public CatGridAdapter(List<CategoryModelClass> catList) {
this.catList = catList;
}
@Override
public int getCount() {
return catList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
//Adding all the views as we get the data from firebase
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cat_item_layout,parent,false);
}
else{
view = convertView;
}

view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//selected_cat_index_app = position;
//   Toast.makeText(parent.getChildAt(position), catList.get(position).getName()+" "+String.valueOf(catList.indexOf(position)), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(parent.getContext(), SetsActivity.class);
parent.getContext().startActivity(intent);
}
});
((TextView) view.findViewById(R.id.catName)).setText(catList.get(position).getName());

Random rnd = new Random();
int color = Color.argb(255,rnd.nextInt(255),rnd.nextInt(255),rnd.nextInt(255));
view.setBackgroundColor(color);
return view;
}
}

CategoryModelClass.java

package com.project.quizapp;
//Model class to fetch the quiz subjects from the Cloud Firestone
public class CategoryModelClass {
//private variable for ID and the name of
private String id;
private String name;
//constructor
public CategoryModelClass(String id, String name) {
this.id = id;
this.name = name;
}
//methods
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

在适配器中实现Filterable接口或更新您的onQueryTextChange实现。

无论何时输入,每次创建带有过滤数据的新适配器。

试试. .在适配器

中创建新方法
public void updateData(List<CategoryModelClass> catList){
this.catList = catList;
notifyDataSetChanged();
}

onQueryTextChange的呼叫

@Override
public boolean onQueryTextChange(String newText) {
//adapter.getFilter().filter(newText);
resultData = new ArrayList<>();
for (CategoryModelClass categoryModelClass : catList) {
if (categoryModelClass.getName().toLowerCase().contains(newText.toLowerCase())) {
resultData.add(categoryModelClass);
}
adapter.updateData(resultData);
}
return true;
}

最新更新