Как реализовать SearchView для фильтрации элементов RecyclerView - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь реализовать SearchView из библиотеки поддержки.Я хочу, чтобы пользователь имел возможность искать / фильтровать список сообщений в RecyclerView.

До сих пор я следовал нескольким учебникам и добавил SearchView в панель действий, но не совсем уверен, куда идти.,Я видел несколько примеров, но ни один из них не показывает результаты, когда пользователь начинает вводить данные в SearchView.

PostAdapter.java:

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

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

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> implements Filterable {

    private Context context;
    private List<Item> items;
    private List<Item> mFilteredList;

    public PostAdapter(Context context, List<Item> items) {
        this.context = context;
        this.items = items;
    }

    @Override
    public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.post_item, parent, false);
        return new PostViewHolder(view);
    }

    @Override
    public void onBindViewHolder(PostViewHolder holder, int position) {
        final Item item = items.get(position);
        holder.postTitle.setText(item.getTitle());
        Document document = Jsoup.parse(item.getContent());
        Elements elements = document.select("img");
        Glide.with(context).load(elements.get(0).attr("src")).into(holder.postImage);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, DetailActivity.class);
                intent.putExtra("pid", item.getId());
                context.startActivity(intent);
            }
        });
    }

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


    @Override
    public Filter getFilter() {

        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    mFilteredList = items;
                } else {

                    ArrayList<Item> filteredList = new ArrayList<>();

                    for (Item item : items) {

                        if (item.getTitle().toLowerCase().contains(charString) || item.getContent().toLowerCase().contains(charString)) {

                            filteredList.add(item);
                        }
                    }

                    mFilteredList = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mFilteredList;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mFilteredList = (List<Item>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }



    public class PostViewHolder extends RecyclerView.ViewHolder {
        ImageView postImage;
        TextView postTitle;


        public PostViewHolder(View itemView) {
            super(itemView);
            postImage = (ImageView) itemView.findViewById(R.id.postImage);
            postTitle = (TextView) itemView.findViewById(R.id.postTitle);

        }

    }


}

My MainActivity.java:

public class MainActivity extends AppCompatActivity {

        DrawerLayout drawerLayout;
        Toolbar toolbar;
        ActionBarDrawerToggle actionBarDrawerToggle;
        NavigationView navigationView;
        RecyclerView recyclerView;
        LinearLayoutManager manager;
        PostAdapter adapter;
        List<Item> items = new ArrayList<>();
        Boolean isScrolling = false;
        int currentItems, totalItems, scrollOutItems;
        String token = "";
        SpinKitView progress;
        Context context;
        SearchView searchView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            recyclerView = (RecyclerView) findViewById(R.id.postList);
            manager = new LinearLayoutManager(this);
            adapter = new PostAdapter(this, items);
            recyclerView.setLayoutManager(manager);
            recyclerView.setAdapter(adapter);
            progress = (SpinKitView) findViewById(R.id.spin_kit);

            setUpToolbar();

            // Navigation Menu Start//
            navigationView = (NavigationView) findViewById(R.id.navigation_menu);
            navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {


                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.nav_home: {
                            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                            startActivity(intent);
                            overridePendingTransition(R.anim.enter, R.anim.exit);
                        }
                        break;
                        case R.id.nav_downloads: {
                            Intent intent = new Intent(getApplicationContext(), DlActivity.class);
                            startActivity(intent);
                            overridePendingTransition(R.anim.enter, R.anim.exit);
                        }
                        break;

                        case R.id.nav_settings: {
                            Intent intent = new Intent(getApplicationContext(), SettingsActivity.class);
                            startActivity(intent);
                            overridePendingTransition(R.anim.enter, R.anim.exit);
                        }
                        break;
                        case R.id.nav_contact_us: {
                            Intent intent = new Intent(getApplicationContext(), ContactActivity.class);
                            startActivity(intent);
                            overridePendingTransition(R.anim.enter, R.anim.exit);
                        }
                        break;
                        case R.id.nav_policy: {
                            Intent intent = new Intent(getApplicationContext(), PolicyActivity.class);
                            startActivity(intent);
                            overridePendingTransition(R.anim.enter, R.anim.exit);
                        }
                        break;
                        case R.id.nav_share: {
                            final String appPackageName = getApplication().getPackageName();
                            String shareBody = "Download " + getString(R.string.app_name) + " From :  " + "http://play.google.com/store/apps/details?id=" + appPackageName;
                            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
                            sharingIntent.setType("text/plain");
                            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
                            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name));
                            startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.app_name)));
                        }
                        break;
                        case R.id.nav_rate: {
                            final String appPackageName = getApplication().getPackageName();
                            try {
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                            } catch (android.content.ActivityNotFoundException anfe) {
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName)));
                            }
                        }
                        break;
                        case R.id.nav_exit: {
                            finish();
                        }
                    }


                    return false;
                }
            });
            /// Navigation menu End ///


            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                        isScrolling = true;
                    }
                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    currentItems = manager.getChildCount();
                    totalItems = manager.getItemCount();
                    scrollOutItems = manager.findFirstVisibleItemPosition();

                    if (isScrolling && (currentItems + scrollOutItems == totalItems)) {
                        isScrolling = false;
                        getData();
                    }
                }
            });


            getData();

            if (!isConnected(MainActivity.this)) buildDialog(MainActivity.this).show();
            else {

            }

        }

        private void setUpToolbar() {
            drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.app_name, R.string.app_name);
            drawerLayout.addDrawerListener(actionBarDrawerToggle);
            actionBarDrawerToggle.syncState();
        }

        protected void getData() {
            String url = BloggerApi.url + "?key=" + BloggerApi.key;
            if (token != "") {
                url = url + "&pageToken=" + token;
            }
            if (token == null) {
                return;
            }

            progress.setVisibility(View.VISIBLE);
            final Call<PostList> postList = BloggerApi.getService().getPostList(url);
            postList.enqueue(new Callback<PostList>() {
                @Override
                public void onResponse(Call<PostList> call, Response<PostList> response) {
                    PostList list = response.body();
                    token = list.getNextPageToken();
                    items.addAll(list.getItems());
                    adapter.notifyDataSetChanged();
                    Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show();
                    progress.setVisibility(View.GONE);
                }

                @Override
                public void onFailure(Call<PostList> call, Throwable t) {
                    Toast.makeText(MainActivity.this, "Error Occured", Toast.LENGTH_SHORT).show();
                }
            });

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {

            getMenuInflater().inflate(R.menu.menu2, menu);

            MenuItem search = menu.findItem(R.id.action_search);
            SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
            search(searchView);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            return super.onOptionsItemSelected(item);
        }

        private void search(SearchView searchView) {

            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {

                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {

                    if (adapter != null) adapter.getFilter().filter(newText);
                    return true;
                }
            });
        }

        public boolean isConnected(Context context) {

            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netinfo = cm.getActiveNetworkInfo();

            if (netinfo != null && netinfo.isConnectedOrConnecting()) {
                android.net.NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                android.net.NetworkInfo mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

                if ((mobile != null && mobile.isConnectedOrConnecting()) || (wifi != null && wifi.isConnectedOrConnecting()))
                    return true;
                else return false;
            } else
                return false;
        }

        public AlertDialog.Builder buildDialog(Context c) {

            AlertDialog.Builder builder = new AlertDialog.Builder(c);
            builder.setTitle("No Internet Connection");
            builder.setMessage("Please switch on your Mobile Data or Wifi Connection. Press ok to Exit");

            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    finish();
                }
            });

            return builder;
        }
}
...