0

我正在尝试通过创建自定义过滤器对 LazyAdapter 类执行搜索。但是当我尝试使用 TextWatcher 执行搜索时,应用程序正在强制关闭。LazyAdapter 类的代码如下: package com.demo.directory; 公共类 LazyAdapter 扩展 BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater = null;
public ImageLoader imageLoader;

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data = d;
    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader = new ImageLoader(activity.getApplicationContext());
}

public View getFilter(CharSequence seq, View convertView) {

    String name_org;
    View vi = convertView;
    convertView = null;
    if (convertView == null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView name = (TextView) vi.findViewById(R.id.name_org); // title
    TextView address = (TextView) vi.findViewById(R.id.address_org); // artist
                                                                        // name
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.list_image); // thumb
                                                                            // image

    for (int i = 0; i < data.size(); i++) {
        HashMap<String, String> org = new HashMap<String, String>();
        org = data.get(i);
        name_org = org.get(OrganizationActivity.KEY_NAME);

        if (name_org != null && seq != null) {
            if (name_org.contains(seq)) {
                name.setText(org.get(OrganizationActivity.KEY_NAME));
                address.setText(org.get(OrganizationActivity.KEY_CITY)
                        + ", " + org.get(OrganizationActivity.KEY_STATE));
                imageLoader.DisplayImage(
                        org.get(OrganizationActivity.KEY_IMAGE_URL),
                        thumb_image);
                notifyDataSetChanged();
            } else {
                org.remove(OrganizationActivity.KEY_NAME);
            }
        }
    }
    return vi;
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (convertView == null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView name = (TextView) vi.findViewById(R.id.name_org); // title
    TextView address = (TextView) vi.findViewById(R.id.address_org); // artist
                                                                        // name
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.list_image); // thumb
                                                                            // image

    HashMap<String, String> org = new HashMap<String, String>();
    org = data.get(position);

    // Setting all values in listview
    name.setText(org.get(OrganizationActivity.KEY_NAME));
    address.setText(org.get(OrganizationActivity.KEY_CITY) + ", "
            + org.get(OrganizationActivity.KEY_STATE));
    imageLoader.DisplayImage(org.get(OrganizationActivity.KEY_IMAGE_URL),
            thumb_image);
    return vi;
}
}

上面的代码现在可以工作了,但是如果我删除了搜索数据,它不会显示任何内容,即如果在搜索后清除了 EditText 数据,则不会返回 ListView 的原始数据。

4

4 回答 4

1

你确定你的name_orgs变量不为???

你必须先检查它,比如,

if(name_org != null && s != null)
{
 if(name_org.contains(s))
 {
 // Your other stuff goes here...
 .
 .
 }
}
于 2012-08-06T07:01:01.520 回答
1

要在清除搜索编辑文本后保留数据项,下面的代码很有用。希望这对您有所帮助。

public Filter getFilter() 
{
    Filter filter = new Filter() 
    {           
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) 
        {
            System.out.println(" --- constraint in publishResults --- "+constraint+" - results - "+results);
            itemDetailList = (List<Dish>)results.values;
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) 
        {
            FilterResults filterResults = new FilterResults();
            List<Dish> filtered_list = new ArrayList<Dish>();
            if(originalItemsDetails == null)
            {
                System.out.println(" --- originalItemsDetails IS NULL --- ");
                originalItemsDetails = new ArrayList<Dish>(itemDetailList);
            }
            else
            {
                System.out.println(" --- originalItemsDetails NOT NULL --- ");
            }

            if(constraint == null || constraint.length() == 0) 
            {
                filterResults.count = originalItemsDetails.size();
                filterResults.values = originalItemsDetails;
            } 
            else 
            {
                constraint = constraint.toString().toLowerCase();
                for(int i=0; i<originalItemsDetails.size(); i++) 
                {
                    String dataNames = originalItemsDetails.get(i).getDishName().toLowerCase();
                    if(dataNames.startsWith(constraint.toString()))  
                    {
                        filtered_list.add(originalItemsDetails.get(i));
                    }
                }

                filterResults.count = filtered_list.size();
                System.out.println(" --- filterResults.count --- "+filterResults.count);

                filterResults.values = filtered_list;
                System.out.println(" --- filterResults.values --- "+filterResults.values);
            }

            System.out.println(" --- constraint in performFiltering --- "+constraint);

            return filterResults;
        }
    };

    return filter;
}
于 2012-08-06T10:16:52.737 回答
1

您可以尝试创建一个自定义过滤器,一旦编辑文本中的数据变为空,它可以帮助再次显示数据。或者您可以为列表视图创建两个适配器,第一个包含列表视图的原始数据,第二个显示编辑文本搜索的搜索结果。一旦编辑文本中的数据变为空,请将 List Adapter 设置为初始值。

于 2012-08-07T09:14:19.797 回答
0

我认为 s 是空的,你检查过吗。因为 contains 方法会抛出 NPE,即使您传递的字符序列为 null

于 2012-08-06T07:03:07.807 回答