从ArrayAdapter上的ListView过滤项目的问题

时间:2012-07-26 11:11:56

标签: android listview filter adapter android-arrayadapter

我正在尝试按照用户输入的关键字过滤列表视图的搜索栏,代码没有错误,但根本没有过滤。知道问题可能是什么?我尝试了各种方法但没有成功。

的OnCreate

super.onCreate(savedInstanceState);
// set layout for the main screen
setContentView(R.layout.layout_main);

// load list application
mListAppInfo = (ListView)findViewById(R.id.lvApps);
EditText search = (EditText)findViewById(R.id.EditText01);

mListAppInfo.setTextFilterEnabled(true);

// create new adapter
final AppInfoAdapter adapter = new AppInfoAdapter(this, Utilities.getInstalledApplication(this), getPackageManager());


// set adapter to list view  
mListAppInfo.setAdapter(adapter);


search.addTextChangedListener(new TextWatcher() {

    public void afterTextChanged(Editable s) {

    }

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

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        Log.e("TAG", "ontextchanged");
       adapter.getFilter().filter(s); //Filter from my adapter
       adapter.notifyDataSetChanged(); //Update my view
    }
});

ArrayAdapter类

public class AppInfoAdapter extends ArrayAdapter<ApplicationInfo> {

    private Context mContext;
    PackageManager mPackManager;

    public AppInfoAdapter(Context c, List<ApplicationInfo> list, PackageManager pm) {
        super(c, 0, list);
        mContext = c;
        mPackManager = pm;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // get the selected entry
        ApplicationInfo entry = (ApplicationInfo) getItem(position);

        Log.e("TAG", entry.toString());

        // reference to convertView
        View v = convertView;

        // inflate new layout if null
        if(v == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            v = inflater.inflate(R.layout.layout_appinfo, null);
        }

        // load controls from layout resources
        ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon);
        TextView tvAppName = (TextView)v.findViewById(R.id.tvName);
        TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack);

        // set data to display
        ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
        tvAppName.setText(entry.loadLabel(mPackManager));
        tvPkgName.setText(entry.packageName);

        // return view
        return v;
    }
}

2 个答案:

答案 0 :(得分:1)

解决此问题有两种可能的方法

1。 使用您自己的过滤算法来过滤适配器。有关详细信息,请参阅此博文 http://www.mokasocial.com/2010/07/arrayadapte-filtering-and-you/

2。 第二个更简单的方法是覆盖您可能已定义的Custom RowItem类中的tostring方法

 @Override
        public String toString() {
            return name + "\n" + description;
        }

并使用adapter.getFilter()。filter(s);因此你正在使用它现在可以工作,因为你的适配器现在返回一个有效的字符串来过滤

答案 1 :(得分:0)

调用adapter.getFilter().filter(s)使用ArrayAdapter的默认String过滤逻辑,但由于您的列表类型为ApplicationInfo,因此ArrayAdapter正在使用ApplicationInfo#toString()进行项目比较
doesn't look like something you want to filter