Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否使用自定义布局筛选listview?_Android_Listview_Android Listview_Filter - Fatal编程技术网

Android 是否使用自定义布局筛选listview?

Android 是否使用自定义布局筛选listview?,android,listview,android-listview,filter,Android,Listview,Android Listview,Filter,所以我有一个基本的自定义listview,每个列表项都有一个图像和文本,我想知道如何使用edittext框动态过滤listview。我查了一下怎么做,但有一点我不知道该怎么做 我的listview是从一个sqlitedatabase中填充的,在这里我有一些方法可以从数据库中检索所有图像名称、文本和ID,并将它们放入listview中。这是我目前为止的代码,我不太确定在publishResult方法中应该做什么 public class MainActivity extends Activity

所以我有一个基本的自定义listview,每个列表项都有一个图像和文本,我想知道如何使用edittext框动态过滤listview。我查了一下怎么做,但有一点我不知道该怎么做

我的listview是从一个sqlitedatabase中填充的,在这里我有一些方法可以从数据库中检索所有图像名称、文本和ID,并将它们放入listview中。这是我目前为止的代码,我不太确定在publishResult方法中应该做什么

public class MainActivity extends Activity {

ListView data;
EditText inputSearch;
ArrayList<String> names, images, ids;
ArrayAdapter<String> adapter;
MyDatabase helper;
ImageView sprite;
TextView name, id;

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

    data = (ListView) findViewById(R.id.listView1);
    helper = new MyDatabase(this);
    helper.openDataBase();

    names = helper.getNameList();
    images = helper.getImageList();
    ids = helper.getIdList();

    adapter = new MyArrayAdapter(this);
    data.setAdapter(adapter);

    inputSearch = (EditText) findViewById(R.id.edit_search);

    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            adapter.getFilter().filter(cs);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                          
        }
    });

}

private class MyArrayAdapter extends ArrayAdapter<String>{

    public MyArrayAdapter(Context c) {
        super(c, R.layout.item_view,names);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if (convertView == null){
            row = getLayoutInflater().inflate(R.layout.item_view, parent,false);
        }

        sprite = (ImageView) row.findViewById(R.id.sprite);
        name = (TextView) row.findViewById(R.id.name);
        id = (TextView) row.findViewById(R.id.ids);

        name.setText(names.get(position).toString());
        int resID = getResources().getIdentifier(images.get(position),"drawable", getPackageName());
        sprite.setImageResource(resID);
        id.setText(ids.get(position).toString());

        return row;
    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        return new Filter(){

            @Override
            protected FilterResults performFiltering(CharSequence input) {

                FilterResults results = new FilterResults();
                int originalLength = names.size();

                if (input == null || input.length() == 0){
                    results.values = names;
                    results.count = originalLength;
                } else {
                    ArrayList<String> newList = new ArrayList<String>();
                    for (int i = 0; i < originalLength; i++){
                        String str = names.get(i);
                        if (str.toLowerCase(Locale.getDefault()).contains(input))
                            newList.add(str);
                        results.values = newList;
                        results.count = newList.size();
                    }
                }
                return results;
            }

            @Override
            protected void publishResults(CharSequence charSequence,
                    FilterResults results) {

                //Not sure what to do here

                notifyDataSetChanged();
            }

        };
    }

}

在这一点上应该很简单

编辑:


试试这个,我想它对你有帮助

 @Override
    protected void publishResults(CharSequence charSequence,
                        FilterResults results) {
    if(results.count==0)
    {
    notifyDataSetInvalidated();
    }else
    {
    names=(ArrayList<String> names)results.values;
    notifyDataSetChanged();
    }

  }

谢谢

这一半解决了它。由于上面的代码只过滤文本而不过滤图像,我如何解释要同时过滤的图像。此外,我还需要制作我的名称数组的另一个副本,因为如果我简单地清除,然后将所有内容添加到名称数组,我将丢失所有原始dataArrayList结果。值这似乎给了我一个错误。但是,当我运行我的应用程序时,当我在edittext框中键入一个字符时,它崩溃了,并没有给我这样的方法错误。
 @Override
    protected void publishResults(CharSequence charSequence,
                        FilterResults results) {
    if(results.count==0)
    {
    notifyDataSetInvalidated();
    }else
    {
    names=(ArrayList<String> names)results.values;
    notifyDataSetChanged();
    }

  }