I am trying to list all the installed applications and filter the result in the list view dynamically. below is my code in the 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
}
In the MainActivity.java, I have below code to act on the Searchview inside OnCreate:
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;
}
});
On entering text in SearchView, it does nothing. It does not filter the list view items or gives any error.
why are you using three arraylist. two is enough. remove packageList
you are returning the true for OnQueryTextSubmit.
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;
}
});
and you are not comparing appname with searchtext and not giving results to 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();
}
}