【问题标题】:Filter Data from List<String> in android onTextChange Android从 Android onTextChange Android 中的 List<String> 过滤数据
【发布时间】:2015-12-27 07:34:53
【问题描述】:

我对 List 中的过滤数据没什么问题。我想过滤 List 中的数据。我的问题是我开始在 edittext 上写文本,而不是列表视图仅显示列表的第一个位置。

这是我的代码。

主类

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 类

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;

    };
}

我在 List 中添加 4 个值

1.线圈 2.板材 3.表 4.额外的

当我开始过滤时它只显示线圈。但是当我触摸列表视图时它的日志完美值但只显示错误值。

帮我解决这个问题。

我的代码有什么遗漏吗?

提前致谢

【问题讨论】:

    标签: android list listview filtering


    【解决方案1】:

    尝试使用此代码过滤 ListViewEditText
    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" />
    

    一个名为 item.xml 的新 TextView 布局,用于显示项目

    <?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>
    

    MainActivity

    中的onCreate() 方法
    @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);
            }
        });
    }
    

    希望对你有帮助

    【讨论】:

    • 我不想从列表视图中获取文本。我想过滤数据并显示到列表视图中。@SaNtoRiaN
    • 知道为什么我会遇到这个问题吗??
    • @Rushabh042 抱歉,您所说的列表中唯一的第一个位置是什么意思?
    • 这意味着我最初添加了“线圈”所以它只在过滤期间显示线圈。@SaNtoRiaN
    • 显示错误 java.lang.IllegalStateException: ArrayAdapter 要求资源 ID 为 TextView
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多