Custom Listview Adapter with filter Android

后端 未结 10 820
北荒
北荒 2020-11-22 06:07

Please am trying to implement a filter on my listview. But whenever the text change, the list disappears.Please Help Here are my codes. The adapter class.

p         


        
10条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-22 06:46

    You can implement search filter in listview by two ways. 1. using searchview 2. using edittext.

    1. If yo want to use searchview then read here : searchview filter.

    2. If you want to use edittext, read below.

    I have taken reference from : listview search filter android

    Code snippets to make filter with edittext.

    First create model class MovieNames.java:

    public class MovieNames {
        private String movieName;
    
        public MovieNames(String movieName) {
            this.movieName = movieName;
        }
    
        public String getMovieName() {
            return this.movieName;
        }
    
    }
    

    Create listview_item.xml file :

         
    
    
        
    
    
    

    Make ListViewAdapter.java class :

        import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.Locale;
    
    public class ListViewAdapter extends BaseAdapter {
    
        // Declare Variables
    
        Context mContext;
        LayoutInflater inflater;
        private ArrayList arraylist;
    
        public ListViewAdapter(Context context, ArrayList arraylist) {
            mContext = context;
            inflater = LayoutInflater.from(mContext);
            this.arraylist = arraylist;
    
        }
    
        public class ViewHolder {
            TextView name;
        }
    
        @Override
        public int getCount() {
            return arraylist.size();
        }
    
        @Override
        public MovieNames getItem(int position) {
            return arraylist.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        public View getView(final int position, View view, ViewGroup parent) {
            final ViewHolder holder;
            if (view == null) {
                holder = new ViewHolder();
                view = inflater.inflate(R.layout.listview_item, null);
                // Locate the TextViews in listview_item.xml
                holder.name = (TextView) view.findViewById(R.id.name);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }
            // Set the results into TextViews
            holder.name.setText(arraylist.get(position).getMovieName());
            return view;
        }
    
    
    } 
    

    Prepare activity_main.xml file :

        
    
    
    
        
    
    
            
        
    
        
    
    
    
    

    Finally make MainActivity.java class :

        import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.SearchView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText etsearch;
        private ListView list;
        private ListViewAdapter adapter;
        private String[] moviewList;
        public static ArrayList movieNamesArrayList;
        public static ArrayList array_sort;
        int textlength = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Generate sample data
    
            moviewList = new String[]{"Xmen", "Titanic", "Captain America",
                    "Iron man", "Rocky", "Transporter", "Lord of the rings", "The jungle book",
                    "Tarzan","Cars","Shreck"};
    
            list = (ListView) findViewById(R.id.listView);
    
            movieNamesArrayList = new ArrayList<>();
            array_sort = new ArrayList<>();
    
            for (int i = 0; i < moviewList.length; i++) {
                MovieNames movieNames = new MovieNames(moviewList[i]);
                // Binds all strings into an array
                movieNamesArrayList.add(movieNames);
                array_sort.add(movieNames);
            }
    
            adapter = new ListViewAdapter(this,movieNamesArrayList);
            list.setAdapter(adapter);
    
    
            etsearch = (EditText) findViewById(R.id.editText);
    
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView parent, View view, int position, long id) {
                    Toast.makeText(MainActivity.this, array_sort.get(position).getMovieName(), Toast.LENGTH_SHORT).show();
                }
            });
    
            etsearch.addTextChangedListener(new TextWatcher() {
    
    
                public void afterTextChanged(Editable s) {
                }
    
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    textlength = etsearch.getText().length();
                    array_sort.clear();
                    for (int i = 0; i < movieNamesArrayList.size(); i++) {
                        if (textlength <= movieNamesArrayList.get(i).getMovieName().length()) {
                            Log.d("ertyyy",movieNamesArrayList.get(i).getMovieName().toLowerCase().trim());
                            if (movieNamesArrayList.get(i).getMovieName().toLowerCase().trim().contains(
                                    etsearch.getText().toString().toLowerCase().trim())) {
                                array_sort.add(movieNamesArrayList.get(i));
                            }
                        }
                    }
                        adapter = new ListViewAdapter(MainActivity.this, array_sort);
                        list.setAdapter(adapter);
    
                }
            });
    
        }
    }
    

提交回复
热议问题