0

カスタム フィルターを作成して、LazyAdapter クラスで検索を実行しようとしています。しかし、TextWatcher を使用して検索を実行しようとすると、アプリケーションが強制的に閉じられます。LazyAdapter クラスのコードは次のとおりです。public class LazyAdapter extends 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

編集テキストのデータが空になったら、データを再び表示するのに役立つカスタム フィルターを作成してみてください。または、リストビュー用に 2 つのアダプターを作成することもできます。1 つ目はリストビューの元のデータを含み、2 つ目は編集テキスト検索の検索結果を表示します。編集テキストのデータが空になったら、List Adapter を初期のものに設定します。

于 2012-08-07T09:14:19.797 に答える
1

あなたの変数name_orgs変数がnullではありませんか???

まず、次のように確認する必要があります。

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 に答える
0

s は null だと思います。確認しましたか。渡すcharsequenceがnullであっても、containsメソッドはNPEをスローするため

于 2012-08-06T07:03:07.807 に答える