1

我是 Android 的初学者,但我尝试进行自定义listview过滤,但它以某种方式工作。我唯一的问题是ArrayList我有图像视图,当我搜索列表时它可以工作,但图像显示错误。我无法解释这一点,但我认为你可以以某种方式帮助我。

无论如何,这里是自定义ArrayAdaptor

public class Listadapter extends ArrayAdapter<HashMap<String, String>> {
    ArrayList<HashMap<String, String>> originalList;
    ArrayList<HashMap<String, String>> productlist;
    private ProductFilter filter;

    public Listadapter(Context context, int textViewResourceId,
            ArrayList<HashMap<String, String>> Strings) {
        super(context, textViewResourceId, Strings);
        this.productlist = new ArrayList<HashMap<String, String>>();
        this.productlist.addAll(productList);
        this.originalList = new ArrayList<HashMap<String, String>>();
        this.originalList.addAll(productList);
    }

    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new ProductFilter();
        }
        return filter;
    }

    /*private class ViewHolder {
            TextView txtprodName;
            TextView txtcategory;
            TextView txtOfferDate;
            ImageView ProductImage;
        }*/

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

    public long getItemId(int position) {
        // return productList.indexOf(getItem(position));
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //ViewHolder holder = null;
        TextView txtprodName, txtcategory, txtOfferDate;
        ImageView ProductImage;
        Log.v("ConvertView", String.valueOf(position));
        //if (convertView == null) {

        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.product_list_item, null);

        //holder = new ViewHolder();
        txtprodName = (TextView) convertView
                .findViewById(R.id.txtprodName);
        txtcategory = (TextView) convertView
                .findViewById(R.id.txtcategory);
        txtOfferDate = (TextView) convertView
                .findViewById(R.id.txtOfferDate);
        ProductImage = (ImageView) convertView
                .findViewById(R.id.ProductImage);
        //convertView.setTag(holder);

        /*} else {
                //holder = (ViewHolder) convertView.getTag();
            }*/
        HashMap<String, String> hm = productList.get(position);

        // txtUserName.setText(lstUsers.get(position).getFirst_Name()+" "+lstUsers.get(position).getLast_Name());
        txtprodName.setText(hm.get(TAG_PRODUCT_NAME));
        txtcategory.setText(hm.get(TAG_CATEGORY_NAME));
        txtOfferDate.setText(hm.get(TAG_OFFER_START_TIME));

        if (drawable.get(position) != null)
            ProductImage.setImageDrawable(drawable.get(position));
        else
            ProductImage.setImageResource(R.drawable.nopic_place);
    }
    return convertView;
}

private class ProductFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<HashMap<String, String>> filteredItems = 
                    new ArrayList<HashMap<String, String>>();
            for (int i = 0, l = originalList.size(); i < l; i++) {
                // ArrayList<HashMap<String, String>> p =
                // originalList.get(i);
                HashMap<String, String> p = originalList.get(i);
                if (p.toString().toLowerCase().contains(constraint))
                    filteredItems.add(p);
            }
            result.count = filteredItems.size();
            result.values = filteredItems;
        } 
        else {
            synchronized (this) {
                result.values = originalList;
                result.count = originalList.size();
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        // TODO Auto-generated method stub
        productList = (ArrayList<HashMap<String, String>>) results.values;
        notifyDataSetChanged();
        clear();
        for (int i = 0, l = productList.size(); i < l; i++)
            add(productList.get(i));
        notifyDataSetInvalidated();
    }
}

以下是结果

在此处输入图像描述 在此处输入图像描述

4

3 回答 3

0

你可以看看这个参考。

根据您的要求,这已解决并且工作相同。

搜索过滤列表视图

浏览此链接,如果您仍有问题,请告诉我。

编辑:

你必须保持一个dummy_drawable ArrayList相同的drawable ArrayList,只保留你的drawable ArrayList作为基础并dummy_drawable在你的适配器中使用。

dummy_drawable ArrayList也从你的FilterResults方法更新这个。像这样:

dummy_drawable.clear();

for (int i = 0, l = originalList.size(); i < l; i++) {
        // ArrayList<HashMap<String, String>> p =
        // originalList.get(i);
        HashMap<String, String> p = originalList.get(i);
        if (p.toString().toLowerCase().contains(constraint)){
              filteredItems.add(p);
              dummy_drawable.add(drawable.get(i));                 
        }
}

谢谢。

于 2012-12-27T07:30:26.457 回答
0

有很多使用 imageview 搜索数据的示例..

这是一些很好的链接,请先阅读并理解代码,然后根据您的要求实施。

示例 1

示例 2

于 2012-12-27T09:12:08.520 回答
0

这是问题的完整解决方案,并且它运行良好...... :)

public class Listadapter extends ArrayAdapter<HashMap<String, String>> {

    ArrayList<HashMap<String, String>> originalList;
    ArrayList<HashMap<String, String>> prodlist;
    private ProductFilter filter;
    ArrayList<Drawable> prodDrawable;

    public Listadapter(Context context, int textViewResourceId,
            ArrayList<HashMap<String, String>> Strings) {
        super(context, textViewResourceId, Strings);
        this.prodlist = new ArrayList<HashMap<String, String>>();
        this.prodlist.addAll(productList);
        this.originalList = new ArrayList<HashMap<String, String>>();
        this.originalList.addAll(productList);
        this.prodDrawable = new ArrayList<Drawable>();
        this.prodDrawable.addAll(drawable);
    }

    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new ProductFilter();
        }
        return filter;
    }

    private class ViewHolder {
        TextView txtprodName;
        TextView txtcategory;
        TextView txtOfferDate;
        ImageView ProductImage;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        Log.v("ConvertView", String.valueOf(position));
        if (convertView == null) {

            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.product_list_item, null);

            holder = new ViewHolder();
            holder.txtprodName = (TextView) convertView
                    .findViewById(R.id.txtprodName);
            holder.txtcategory = (TextView) convertView
                    .findViewById(R.id.txtcategory);
            holder.txtOfferDate = (TextView) convertView
                    .findViewById(R.id.txtOfferDate);
            holder.ProductImage = (ImageView) convertView
                    .findViewById(R.id.ProductImage);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        HashMap<String, String> hm = prodlist.get(position);

        holder.txtprodName.setText(hm.get(TAG_PRODUCT_NAME));
        holder.txtcategory.setText(hm.get(TAG_CATEGORY_NAME));
        holder.txtOfferDate.setText(hm.get(TAG_OFFER_START_TIME));

        /*
         * if (drawable.get(position) != null)
         * holder.ProductImage.setImageDrawable(drawable.get(position));
         * else
         * holder.ProductImage.setImageResource(R.drawable.nopic_place);
         */

        try {
            holder.ProductImage
                    .setImageDrawable(prodDrawable.get(position));
        } catch (Exception exception) {
            holder.ProductImage.setImageResource(R.drawable.nopic_place);
        }
        return convertView;
    }
    private class ProductFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<HashMap<String, String>> filteredItems = new ArrayList<HashMap<String, String>>();
                prodDrawable.clear();
                for (int i = 0, l = originalList.size(); i < l; i++) {
                    HashMap<String, String> p = originalList.get(i);
                    if (p.toString().toLowerCase().contains(constraint)) {
                        filteredItems.add(p);
                        try {
                            prodDrawable.add(drawable.get(i));
                        } catch (Exception exception) {
                            prodDrawable.add(null);
                        }
                    }
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            } else {
                synchronized (this) {
                    prodDrawable.clear();
                    prodDrawable.addAll(drawable);
                    result.values = originalList;
                    result.count = originalList.size();
                }
            }
            return result;
        }
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            // TODO Auto-generated method stub
            prodlist = (ArrayList<HashMap<String, String>>) results.values;
            notifyDataSetChanged();
            clear();
            for (int i = 0, l = prodlist.size(); i < l; i++)
                add(prodlist.get(i));
            notifyDataSetInvalidated();
        }

    }

}
于 2013-01-04T12:21:30.423 回答