【问题标题】:Filtering in recyclerView not working, No error在 recyclerView 中过滤不起作用,没有错误
【发布时间】:2018-05-14 17:22:14
【问题描述】:

我的 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 中没有显示错误,也没有异常活动。

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    您的两个列表都指向同一个列表。应该是这样的。

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

    【讨论】:

    • 试过它不起作用,列表仍然保持不变并且在我输入时不会改变!谢谢你的意见:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2018-08-23
    • 2018-11-28
    • 1970-01-01
    • 2020-12-26
    • 2011-08-05
    • 2016-11-05
    相关资源
    最近更新 更多