我正在尝试列出所有已安装的应用程序,并在列表视图中动态过滤结果。下面是我在listadapter.java中的代码:
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
public class Listadapter extends BaseAdapter implements Filterable {
List<PackageInfo> packageList;
List<PackageInfo> filteredData = null;
List<PackageInfo> originalData = null;
Activity context;
PackageManager packageManager;
boolean[] itemChecked;
private boolean notifyChanged = true;
ItemFilter mFilter = new ItemFilter();
LayoutInflater mInflater;
public Listadapter(Activity context, List<PackageInfo> packageList,
PackageManager packageManager) {
super();
this.context = context;
this.packageList = packageList;
itemChecked = new boolean[packageList.size()];
this.packageManager = packageManager;
this.filteredData = packageList;
this.originalData = packageList;
mInflater = LayoutInflater.from(context);
}
private class ViewHolder {
TextView apkName;
CheckBox ck1;
}
public int getCount() {
if(filteredData==null){
Log.v("LOG", "Warn, null filteredData");
return 0;
}else{
return filteredData.size();
}
}
public Object getItem(int position) {
return filteredData.get(position);
}
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.apkName = (TextView) convertView
.findViewById(R.id.textView1);
// holder.ck1 = (CheckBox) convertView
// .findViewById(R.id.checkBox1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PackageInfo packageInfo = (PackageInfo) getItem(position);
SimpleDateFormat sdf = new SimpleDateFormat("[yyyy-MM-dd]");
Drawable appIcon = packageManager
.getApplicationIcon(packageInfo.applicationInfo);
//String packageName = packageInfo.packageName;
String appName = packageManager.getApplicationLabel(
packageInfo.applicationInfo).toString() + "\n" + sdf.format(new Date(packageInfo.firstInstallTime));
// String appName = packageManager.getApplicationLabel(
// packageInfo.applicationInfo).toString()+ "\n" + packageInfo.packageName ;
appIcon.setBounds(0, 0, 150, 150);
holder.apkName.setCompoundDrawables(appIcon, null, null, null);
holder.apkName.setCompoundDrawablePadding(15);
holder.apkName.setText(appName);
// holder.apkName.setText(packageName);
// holder.ck1.setChecked(false);
// if (itemChecked[position])
// holder.ck1.setChecked(true);
// else
// holder.ck1.setChecked(false);
/*
holder.ck1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.ck1.isChecked())
itemChecked[position] = true;
else
itemChecked[position] = false;
}
});
if (itemChecked != null) {
}
*/
return convertView;
}
//////search filter
@Override
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<PackageInfo> list = originalData;
int count = packageList.size();
final ArrayList<PackageInfo> nlist = new ArrayList<>(count);
PackageInfo filterableString;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
packageList = (ArrayList<PackageInfo>) results.values;
notifyDataSetChanged();
}
}
///filter finished
}
在MainActivity.java中,我有以下代码在OnCreate内的Searchview上执行操作:
final Listadapter Adapter = new Listadapter(this, (ArrayList<PackageInfo>) packageList1, packageManager);
apps.setAdapter(Adapter);
//enables filtering for the contents of the given ListView
apps.setTextFilterEnabled(true);
final SearchView sv = (SearchView) findViewById(R.id.inputSearch);
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String text) {
return false;
}
@Override
public boolean onQueryTextChange(String text) {
Adapter.getFilter().filter(text);
return false;
}
});
在SearchView中输入文本时,它什么都不做。它不会过滤列表视图项或给出任何错误。
答案 0 :(得分:0)
你为什么要使用三个arraylist。两个就够了。删除packageList
你正在为OnQueryTextSubmit返回true。
searchView.setQueryHint("Search");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (adapter != null && newText != null) {
adapter.getFilter().filter(newText);
return true;
}
return false;
}
});
并且您没有将appname与searchtext进行比较,也没有将结果提供给listview。
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String constraintStr = constraint.toString().toLowerCase(Locale.getDefault());
FilterResults result = new FilterResults();
if (constraintStr != null & constraintStr.length() > 0) {
ArrayList<PackageInfo> filterItems = new ArrayList< PackageInfo>();
synchronized (this) {
for (PackageInfo item : originalData) {
if (packageManager.getApplicationLabel(
item.applicationInfo).toLowerCase(Locale.getDefault()).contains(constraintStr)) {
filterItems.add(item);
}
}
result.count = filterItems.size();
result.values = filterItems;
}
} else {
synchronized (this) {
result.count = originalData.size();
result.values = originalData;
}
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<PackageInfo>) results.values;
// Debug.e("filteredData", "" + filteredData.toString());
notifyDataSetChanged();
}
}