Как отфильтровать данные в представлении переработчика - PullRequest
0 голосов
/ 22 мая 2019

Я получаю данные с сервера в представлении переработчика. В файле макета у меня сверху есть поле EditText, а под ним - представление переработчика. Я хочу фильтровать данные на основе того, что я написал в поле EditText. Моя проблема заключается в том, что, когда я начинаю печатать в поле EditText, он не отображает данные в утилите, а когда я удаляю все в поле EditText, он показывает все. Почему это происходит, даже если у меня есть данные в представлении переработчика с тем же именем, которое я ввел в поле EditText.

Это мой код ниже:

Home.java

public class Home extends Fragment {

String myValue;
RecyclerView recycle;
ArrayList<LoadHomeBooks> list;
HomeBookAdapter adapter;
EditText search;


private static final String URL = "https://www.example.com";

public Home() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_home, container, false);

    recycle = view.findViewById(R.id.recycle);
    refresh = view.findViewById(R.id.refresh);
    search = view.findViewById(R.id.search);

    list = new ArrayList<>();

    recycle.setHasFixedSize(true);
    recycle.setLayoutManager(new LinearLayoutManager(getActivity()));

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(22, TimeUnit.SECONDS)
            .readTimeout(22, TimeUnit.SECONDS)
            .writeTimeout(22, TimeUnit.SECONDS)
            .build();

    RequestBody formBody = new FormBody.Builder().add("city", myValue).build();

    Request request = new Request.Builder().url(URL).post(formBody).build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onResponse(Call call, final Response response) throws IOException {

            if (getActivity() != null) {

                getActivity().runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        try {

                            JSONArray jsonArray = new JSONArray(response.body().string());


                            for (int i = jsonArray.length() - 1; i > -1; i--) {

                                JSONObject object = jsonArray.getJSONObject(i);

                                String str1 = object.getString("Book_name");


                                LoadHomeBooks model = new LoadHomeBooks(str1);

                                list.add(model);
                            }

                             adapter = new HomeBookAdapter(list, getActivity());

                            recycle.setAdapter(adapter);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }


        }

        @Override
        public void onFailure(Call call, final IOException e) {

            if (getActivity() != null) {

                getActivity().runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                      TastyToast.makeText(getActivity(), e.getMessage(), TastyToast.LENGTH_LONG, TastyToast.ERROR).show();
                    }
                });

            }

        }

    });

  search.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            ArrayList<LoadHomeBooks> filterBooks = new ArrayList<>();

            for(LoadHomeBooks books: list){

                String name = books.getbName().toLowerCase();

                if(name.contains(s)){

                    filterBooks.add(books);
                }

                adapter.setFilter(filterBooks);
            }
        }
    });

    return view;
 }

}

HomeBookAdapter.java

public class HomeBookAdapter extends RecyclerView.Adapter<HomeBookAdapter.ViewHolder> {

ArrayList<LoadHomeBooks> list;
Context context;

public HomeBookAdapter(ArrayList<LoadHomeBooks> list,Context context){

    this.list = list;
    this.context = context;
}

@NonNull
@Override
public HomeBookAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_book_layout,viewGroup,false);

    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull HomeBookAdapter.ViewHolder viewHolder, int i) {

    LoadHomeBooks model = list.get(i);

    viewHolder.homeBookName.setText(model.getbName());

}

@Override
public int getItemCount() {
    return list.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView homeBookName;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        homeBookName = itemView.findViewById(R.id.homeBookName);
    }
}

public void setFilter(ArrayList<LoadHomeBooks> filterBooks){

    list = new ArrayList<>();
    list.addAll(filterBooks);
    notifyDataSetChanged();

  } 
}

LoadHomeBooks.java

public class LoadHomeBooks {

String bName;

public LoadHomeBooks(){

 }

public LoadHomeBooks(String bName){

    this.bName = bName;

 }

public String getbName() {
    return bName;
 }

public void setbName(String bName) {
    this.bName = bName;
 }

}

Кто-то, пожалуйста, дайте мне знать, что я делаю неправильно. Любая помощь будет оценена.

СПАСИБО

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Переместите этот код за пределы цикла Loop

adapter.setFilter(filterBooks);

Поскольку адаптер вызывает набор фильтров после каждой итерации.

Также я бы попросил вас переместить сетевой запрос в Activity вместо Fragment, используяинтерфейс.

0 голосов
/ 22 мая 2019
for(LoadHomeBooks books: list){

                String name = books.getbName().toLowerCase();

                if(name.contains(s)){

                    filterBooks.add(books);
                }

                adapter.setFilter(filterBooks); //Place this line outside forloop
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...