Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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 如何通过EditText筛选ListView_Android_Database_Listview_Filter_Cursor - Fatal编程技术网

Android 如何通过EditText筛选ListView

Android 如何通过EditText筛选ListView,android,database,listview,filter,cursor,Android,Database,Listview,Filter,Cursor,我正在为android制作一个类似电子书的应用程序,我想过滤书名,但每次你在edittext中输入一个单词或句子,它都会搜索书籍的内容。。。有人能帮我吗 您需要为edittext编写textChangedlistener(或)TextWatcher。在侦听器内部,您需要编写搜索逻辑。这是。下面是一个示例。试试这个,每当你在编辑文本中输入文本时,列表将显示过滤结果,就像我在图像中显示的一样 首字母: 过滤: 这是main.xml <?xml version="1.0" encoding=

我正在为android制作一个类似电子书的应用程序,我想过滤书名,但每次你在edittext中输入一个单词或句子,它都会搜索书籍的内容。。。有人能帮我吗

您需要为edittext编写textChangedlistener(或)TextWatcher。在侦听器内部,您需要编写搜索逻辑。这是。下面是一个示例。

试试这个,每当你在编辑文本中输入文本时,列表将显示过滤结果,就像我在图像中显示的一样

首字母:

过滤:


这是main.xml

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

<EditText 
    android:id="@+id/etSearchbox"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
<ListView 
    android:id="@+id/lvFirst"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"

    ></ListView>    

</LinearLayout>

这是FilterListActivity.java

package com.filterlist;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class FilterListActivity extends Activity{

EditText etSearchbox;
ListView lvFirst;
ArrayAdapter<String> adapter1;
String[] data = {"mehul joisar","amit mishra","amitabh","Aamir khan","jesica","katrina"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

etSearchbox=(EditText)findViewById(R.id.etSearchbox);
lvFirst=(ListView)findViewById(R.id.lvFirst);
lvFirst.setTextFilterEnabled(true);

adapter1 = new ArrayAdapter<String>(FilterListActivity.this, android.R.layout.simple_list_item_1, data);   
lvFirst.setAdapter(adapter1);

etSearchbox.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        FilterListActivity.this.adapter1.getFilter().filter(arg0);
    }

    @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

    }
});




}
}
package com.filterlist;
导入android.app.Activity;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.ArrayAdapter;
导入android.widget.EditText;
导入android.widget.ListView;
公共类FilterListActivity扩展活动{
编辑文本搜索框;
列表视图优先;
阵列适配器1;
字符串[]数据={“mehul joisar”、“amit mishra”、“amitabh”、“Aamir khan”、“jesica”、“katrina”};
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etSearchbox=(EditText)findViewById(R.id.etSearchbox);
lvFirst=(ListView)findViewById(R.id.lvFirst);
lvFirst.setTextFilterEnabled(true);
adapter1=新阵列适配器(FilterListActivity.this,android.R.layout.simple\u list\u item\u 1,数据);
lvFirst.setAdapter(适配器1);
etSearchbox.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列arg0、int arg1、int arg2、int arg3){
//TODO自动生成的方法存根
FilterListActivity.this.adapter1.getFilter().filter(arg0);
}
@凌驾
更改前的公共void(字符序列arg0、int arg1、int arg2、,
int arg3){
//TODO自动生成的方法存根
}
@凌驾
public void PostTextChanged(可编辑arg0){
//TODO自动生成的方法存根
}
});
}
}

我有一个工作示例,请尝试以下方法:

filterEditText = (EditText)findViewById(R.id.filter);
filterEditText.addTextChangedListener(filterTextWatcher);

TextWatcher filterTextWatcher = new TextWatcher() {

        public void beforeTextChanged(CharSequence s, int start, int count,int after) {  

        }  
        public void onTextChanged(CharSequence s, int start, int before,int count) {  
            adapter.getFilter().filter(s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub              
        }  
    };
适配器必须
实现可过滤

            @Override
            public Filter getFilter() {
//              Filter filter = null;

                if(filter == null)
                    filter = new CheeseFilter();
                return filter;
            }
和过滤器类:

        public class CheeseFilter extends Filter {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // TODO Auto-generated method stub

                constraint = constraint.toString().toLowerCase();

                FilterResults newFilterResults = new FilterResults();

                if (constraint != null && constraint.length() > 0) {


                    ArrayList<String> auxData = new ArrayList<String>();

                    for (int i = 0; i < data.size(); i++) {
                        if (data.get(i).toLowerCase().contains(constraint))
                            auxData.add(data.get(i));
                    }

                    newFilterResults.count = auxData.size();
                    newFilterResults.values = auxData;
                } else {

                    newFilterResults.count = data.size();
                    newFilterResults.values = data;
                }

                return newFilterResults;
            }

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

                ArrayList<String> resultData = new ArrayList<String>();

                resultData = (ArrayList<String>) results.values;

                EfficientAdapter adapter = new EfficientAdapter(context, resultData);
                list.setAdapter(adapter);

//              notifyDataSetChanged();
            }

        }
public类CheeseFilter扩展了过滤器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
//TODO自动生成的方法存根
constraint=constraint.toString().toLowerCase();
FilterResults newFilterResults=新FilterResults();
if(constraint!=null&&constraint.length()>0){
ArrayList auxData=新的ArrayList();
对于(int i=0;i
您可以查看此帖子以了解更多信息:


使用自定义listView时

适配器:

public class Adapter extends ArrayAdapter {
ArrayList<String> list = new ArrayList<>();
ArrayList<String> filteredData = new ArrayList<>();

public Adapter(@NonNull Context context, int resource) {
    super(context, resource);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    LayoutInflater inflate = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    @SuppressLint("ViewHolder") View vi = inflate.inflate(R.layout.ly_items, null);
    try {
        JSONObject js = new JSONObject(list.get(position));
        TextView txtItem = vi.findViewById(R.id.txtItem);
        ImageView imgItem = vi.findViewById(R.id.imgItem);
        txtItem.setText(js.getString("name") + " - " + js.getInt("number"));
        Picasso.get().load(js.getString("logo_url")).into(imgItem);

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return vi;
}

@Override
public void add(@Nullable Object object) {
    super.add(object);
    list.add(object.toString());
    filteredData.add(object.toString());
}

@Override
public int getCount() {
    return list.size();
}

@Nullable
@Override
public Object getItem(int position) {
    return list.get(position);
}


public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    list.clear();
    if (charText.length() == 0) {
        list.addAll(filteredData);
    } else {
        for (String wp : filteredData) {

            try {
                JSONObject json = new JSONObject(wp);
                if (json.getString("name").toLowerCase().contains(charText) || json.getString("number").contains(charText)) {
                    list.add(wp);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
    notifyDataSetChanged();
    }
}

看到这篇帖子我在这上面呆了一段时间,发现一些答案非常复杂,所以最终在这里发布了一个简化的答案:我已经看到了所有的主题,但不是我要找的主题。。如果你知道的话,请给我发一个运行程序,这样我就可以看看它是否可行。。谢谢这太棒了!但我想做的稍微不同。我有一个适配器,用于列出前10个CTIE(这是一个静态列表)。现在,当用户在编辑文本框中键入时,我希望从我拥有的其他城市列表中选择过滤器。我如何才能做到这一点?好的。让我知道,从其他城市列表中筛选后,您希望在哪里显示筛选结果?
    Adapter adapter;
ListView list;
EditText edtSearch;

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

list = findViewById(R.id.list);

edtSearch = findViewById(R.id.edtSearch);

 adapter = new Adapter(this, android.R.layout.simple_list_item_1);


list.setAdapter(adapter);

edtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

    }