java - 在 recyclerView 中过滤不起作用,没有错误
问题描述
我在回收站视图中的过滤逻辑有问题。每当我在搜索视图中输入内容时,recyclerview 都保持不变,无论我在搜索视图中输入什么内容,它都不会改变。
这是我的 RecyclerViewAdapter:
public class UniversitiesAdapter extends RecyclerView.Adapter<UniversitiesAdapter.UniversitiesViewHolder> implements Filterable{
private Context mCtx;
public ArrayList<Universities> universitiesList;
public ArrayList<Universities> universityFilter;
public UniversitiesAdapter(Context mCtx, ArrayList<Universities> universitiesList){
this.mCtx = mCtx;
this.universitiesList = universitiesList;
this.universityFilter = universitiesList;
}
@Override
public UniversitiesViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
LayoutInflater inflater = LayoutInflater.from(mCtx);
View view = inflater.inflate(R.layout.university_cardview_rows,null);
return new UniversitiesViewHolder(view);
}
@Override
public void onBindViewHolder(UniversitiesViewHolder holder, int position){
UniversitiesViewHolder.currentUniversity = universityFilter.get(position);
Universities universities = universityFilter.get(position);
//loading the image
Glide.with(mCtx)
.load(universities.getUniversityLogo())
.into(holder.uniLogo);
holder.uniLocation.setText(universities.getUniveristyLocation());
holder.uniName = universities.getUniversityName();
holder.uniID = universities.getUniversityId();
holder.universityLongitude = universities.getUniversityLongitude();
holder.universityLatitude = universities.getUniversityLatitude();
holder.dormBldgNumber.setText(String.valueOf(universities.getDormbuildingsNumber()));
//TODO add holder for number of dorm buildings
}
@Override
public int getItemCount(){
return universityFilter.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
universityFilter = universitiesList;
Log.d("hello",String.valueOf(universityFilter));
} else {
ArrayList<Universities> filteredList = new ArrayList<>();
for (Universities universities : universitiesList) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (universities.getUniversityName().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(universities);
Log.d("HELP", String.valueOf(universities));
}
}
universityFilter = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = universityFilter;
Log.d("hell", String.valueOf(filterResults));
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
universityFilter = (ArrayList<Universities>) filterResults.values;
notifyDataSetChanged();
}
};
}
public static class UniversitiesViewHolder extends RecyclerView.ViewHolder{
public String uniName;
public int uniID;
public double universityLongitude, universityLatitude;
TextView uniLocation, dormBldgNumber;
ImageView uniLogo;
public View view;
public static Universities currentUniversity;
public UniversitiesViewHolder(View itemView){
super(itemView);
view = itemView;
view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View itemView){
Intent intent = new Intent(itemView.getContext(),DormBuildings.class);
intent.putExtra("uniID",uniID);
intent.putExtra("uniName",uniName);
intent.putExtra("universityLongitude", universityLongitude);
intent.putExtra("universityLatitude", universityLatitude);
itemView.getContext().startActivity(intent);
}
});
uniLocation = itemView.findViewById(R.id.uniLocation);
dormBldgNumber= itemView.findViewById(R.id.dormBldgNumber);
uniLogo = itemView.findViewById(R.id.uniLogo);
}
}
}
这是我的主要活动:
public class UniversityPick extends AppCompatActivity {
//TODO FIX SEARCH AND DORMBUILDING NUMBER
private static final String URL_PRODUCTS = "http://XXXXX/XXXXX.php";
ArrayList<Universities> universitiesList;
RecyclerView recyclerView;
SearchView searchView;
SwipeRefreshLayout unirefresh;
DrawerLayout mDrawerLayout;
private UniversitiesAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_university_pick);
searchView = (SearchView) findViewById(R.id.searchView);
searchView.setIconifiedByDefault(false);
searchView.clearFocus();
//University list
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
universitiesList = new ArrayList<>();
loadUniversities();
adapter = new UniversitiesAdapter(UniversityPick.this,universitiesList);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
});
unirefresh = (SwipeRefreshLayout) findViewById(R.id.unirefresh);
unirefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadUniversities();
unirefresh.setRefreshing(false);
}
});
}
private void loadUniversities(){
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_PRODUCTS, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray array = new JSONArray(response);
for (int i = 0; i<array.length(); i++){
JSONObject universities = array.getJSONObject(i);
universitiesList.add(new Universities(
universities.getInt("universityId"),
universities.getString("universityName"),
universities.getString("universityLocation"),
universities.getString("universityLogo"),
universities.getDouble("universityLongitude"),
universities.getDouble("universityLatitude"),
universities.getInt("dormbuildingsNumber")
));
}
UniversitiesAdapter adapter = new UniversitiesAdapter(UniversityPick.this,universitiesList);
recyclerView.setAdapter(adapter);
} catch(JSONException e) {
e.printStackTrace()
;
}
}
},
new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error){
}
});
Volley.newRequestQueue(this).add(stringRequest);
}
logcat 中没有显示错误,也没有异常活动。
解决方案
您的两个列表都指向同一个列表。应该是这样。
public UniversitiesAdapter(Context mCtx, ArrayList<Universities> universitiesList){
this.mCtx = mCtx;
this.universitiesList = universitiesList;
universityFilter=new ArrayList<>();
universityFilter.addAll(universitiesList);
}
在过滤器中:-
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
universityFilter.clear();
if (charString.isEmpty()) {
universityFilter.addAll();
Log.d("hello",String.valueOf(universityFilter));
} else {
for (Universities universities : universitiesList) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (universities.getUniversityName().toLowerCase().contains(charString.toLowerCase())) {
universityFilter.add(universities);
Log.d("HELP", String.valueOf(universities));
}
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = universityFilter;
Log.d("hell", String.valueOf(filterResults));
return filterResults;
}
推荐阅读
- c# - 尝试 Web API Dynamics 365 CRM - 403-禁止错误
- powershell - 使用 PS 合并计算机类型和资产标签
- python - 将用户主路径地址输入字符串的正确或最佳方法是什么?
- javascript - 在 .json 文件的数组中查找特定信息
- powershell - Select-String 成功找到一个字符串,用其他内容替换找到的字符串失败
- swift - 整数索引处的 Swift 5 拆分字符串
- apache-flink - PyFlink - Scala UDF - 如何在 Table API 中转换 Scala Map?
- reactjs - 有没有办法使用 vh 来 window.scrollY ?
- arrays - 为什么打字稿假定数组元素查找不会未定义?
- java - Android Room 数据库 @Insert 方法返回从 0 开始的行 id