как использовать панель поиска во фрагменте recyclerView - PullRequest
0 голосов
/ 07 сентября 2018

// В основном я хочу добавить строку поиска в мой фрагмент. здесь, в этом фрагменте, я получаю всю ценность в моем обзоре переработчика, но есть более 300 значений, которые я должен отфильтровать через панель поиска. // функция addTextListener () использую для того же, но получаю ошибку

package Fragment;

    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.EditText;

    import com.example.rspl_aequm.operation.Api;
    import com.example.rspl_aequm.operation.R;

    import java.util.ArrayList;
    import java.util.List;

    import Adapter.Tab1_Adapter;
    import Pojo.Tab1_Pojo;
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;

    public class Tab1Fragment extends Fragment {

        private List<Tab1_Pojo> itemlist = new ArrayList<>();
        private RecyclerView recyclerView;
        private RecyclerView.LayoutManager layoutManger;
        private RecyclerView.Adapter adapter;
        public static String Url = "http://35.201.138.23:8080/Operation_Myql/Api/Store_Status.jsp";
        public EditText search;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            final View rootView = inflater.inflate(R.layout.fragment_one, container, false);

            //return inflater.inflate(R.layout.fragment_one, container, false);

            recyclerView = (RecyclerView) rootView.findViewById(R.id.recycleview);
            recyclerView.setHasFixedSize(true);

           // final ProgressDialog loading = ProgressDialog.show(getActivity()," Fetching data...","please wait....",false,false);

            layoutManger = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(layoutManger);
            search = (EditText)rootView.findViewById( R.id.search);

            addTextListener();
            getStoreList();

            return rootView;

        }


        public void getStoreList() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Api.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
                    .build();

            Api api = retrofit.create(Api.class);

            Call<Tab1_Pojo> call = api.getStoreList("Created");

            call.enqueue(new Callback<Tab1_Pojo>() {
                @Override
                public void onResponse(Call<Tab1_Pojo> call, Response<Tab1_Pojo> response) {
                    List<Tab1_Pojo>tab1_pojos = response.body().getStore_Status();
                    recyclerView.setAdapter(new Tab1_Adapter(Tab1Fragment.this,tab1_pojos));
                }

                @Override
                public void onFailure(Call<Tab1_Pojo> call, Throwable t) {
                }
            });
        }

        public void sendtoanotehrfragment(Bundle bundle){
            System.out.println(" im Here ");
            FragmentManager manager=getActivity().getFragmentManager();
            StoreDetails fragment = new StoreDetails();
            FragmentTransaction ft = manager.beginTransaction()
                    .replace(R.id.cont,fragment,"fragment");
            ft.addToBackStack("fragment");
            fragment.setArguments(bundle);
            ft.commit();
        }



    public void addTextListener() {
        search.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {
            }

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

            public void onTextChanged(CharSequence query, int start, int before, int count) {

                query = query.toString().toLowerCase();

                final List<Tab1_Pojo> filteredList = new ArrayList<>();

                for (int i = 0; i < itemlist.size(); i++) {

                    final String id = itemlist.get(i).getSTORE_ID();
                    final String name = itemlist.get(i).getSTORE_NAME();
                    final String status = itemlist.get(i).getSTATUS();



                    if (id.toLowerCase().contains(query)||name.toLowerCase().contains(query)||status.toLowerCase().contains(query)) {

                        filteredList.add(itemlist.get(i));
                    }


    //

                }
                recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// here in below line am getting error
                adapter = new Tab1_Adapter(filteredList, getContext(),getFragmentManager());
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }

        });
    }
    }

// Пожалуйста, помогите мне в этом. Я приложил полный фрагмент здесь Спасибо

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Первое, что я могу вам предложить, это хранить ваши данные где-нибудь (База данных), а после этого вы можете выполнять поиск в Базе данных (FTS) -> https://developer.android.com/training/search/search

Второе, что я могу вам предложить, это переместить вашу бизнес-логику (вызовы REST, поиск) за пределы пользовательского интерфейса (Activity, Fragment) и начать использовать Android Architecture Components, например ViewModel и LiveData.

0 голосов
/ 07 сентября 2018

Я бы посоветовал внедрить Filterable в свой «адаптер» и переопределить getFilter (), где вы можете поместить свою логику фильтрации. После этого вы можете сделать это непосредственно в OnTextChanged.

adapter.getFilter().filter(query);

Посмотрите по этой ссылке, как реализовать Filterable в адаптере:

https://www.androidhive.info/2017/11/android-recyclerview-with-search-filter-functionality/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...