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