RushDroid
RushDroid

Reputation: 1600

Filter Data from List<String> in android onTextChange Android

I have little problem with filter data from List.i want to filter data from List. My Problem is wech i start to write text on edittext than the listview shows thw only first posision of the List.

Here is my Code.

MainClass

public class ItemType extends AppCompatActivity {

    ListView item;
    Context context=this;
    List<String> allItemNames = new ArrayList<String>();
    Item_Type_list_adapter adapter;
    EditText search;
    ArrayAdapter<String> adapter1;
    String[] data = {"mehul joisar","amit mishra","amitabh","Aamir khan","jesica","katrina"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_type);

        search=(EditText)findViewById(R.id.Search);

        item=(ListView)findViewById(R.id.item_type_listview);

        allItemNames = new ArrayList<String>();

        allItemNames.add("Coil");
        allItemNames.add("Plate");
        allItemNames.add("Sheet");
        allItemNames.add("Extra");

        adapter=new Item_Type_list_adapter(this,allItemNames);

        item.setAdapter(adapter);


        item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                String data = (String) adapterView.getItemAtPosition(i);
                Log.d("Positions", data);

            }
        });

        search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence cs, int i, int i1, int i2) {

                adapter.getFilter().filter(search.getText().toString());
                adapter.notifyDataSetChanged();
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_item_type, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement


        return super.onOptionsItemSelected(item);
    }
}

ArrayAdapter Class

public class Item_Type_list_adapter extends ArrayAdapter<String> implements Filterable {

    Activity context;
    private final List<String> allNames;

    public Item_Type_list_adapter(Activity context,List<String> allNames) {
        super(context, R.layout.item_type_layout,allNames);
        this.context=context;
        this.allNames=allNames;
    }
    public View getView(int position,View view,ViewGroup parent) {
        LayoutInflater inflater=context.getLayoutInflater();
        View rowView=inflater.inflate(R.layout.item_type_layout, null, true);

        TextView ItemName = (TextView) rowView.findViewById(R.id.ItemName);

        ItemName.setText(allNames.get(position));


        return rowView;

    };
}

I Add the 4 value in List

1.Coil 2.Plate 3.sheet 4.extra

And when i start filter it only showing the Coil.But When i touch on listview its Log perfect Value But just Showing Wrong value.

Help me to solve this issue.

is there any missing in my code?

Thanks in advance

Upvotes: 0

Views: 1073

Answers (1)

SaNtoRiaN
SaNtoRiaN

Reputation: 2202

Try out this code for filtering ListView with EditText
activity_main.xml

<EditText
    android:id="@+id/etText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10">

    <requestFocus />
</EditText>

<ListView
    android:id="@+id/list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:isScrollContainer="false" />

a new TextView layout called item.xml for showing items

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</TextView>

onCreate() method inside MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Array list of items
    List<String> itemsList = new ArrayList<String>();
    itemsList.add("AAAA");
    itemsList.add("AABC");
    itemsList.add("ABCD");
    itemsList.add("BBCD");
    itemsList.add("BCDE");
    itemsList.add("CCDE");
    itemsList.add("CDEF");


    // create an ArrayAdaptar from the String Array
    final ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            R.layout.item, itemsList);
    ListView listView = (ListView) findViewById(R.id.list);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);

    // enables filtering for the contents of the given ListView
    listView.setTextFilterEnabled(true);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // When clicked, show a toast with the TextView text
            Toast.makeText(getApplicationContext(),
                    ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
        }
    });

    EditText myFilter = (EditText) findViewById(R.id.etText);
    myFilter.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) {
            dataAdapter.getFilter().filter(s);
        }
    });
}

hope it helps

Upvotes: 1

Related Questions