Фильтрация в программе повторного использования не работает, нет ошибок - PullRequest
0 голосов
/ 14 мая 2018

У меня проблемы с логикой фильтрации в моем обзоре переработчика. Всякий раз, когда я вписываю в поисковое представление, у меня есть повторное представление, которое остается неизменным, независимо от того, что я печатаю в поисковом обзоре.

Вот мой 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, и нет ничего необычного в ней.

1 Ответ

0 голосов
/ 14 мая 2018

Ваши оба списка указывают на один и тот же список. Должно быть так.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...