【问题标题】:Custom Filtering ArrayAdapter in ListView not working for imageviewListView 中的自定义过滤 ArrayAdapter 不适用于 imageview
【发布时间】:2013-01-04 20:21:30
【问题描述】:

我是 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();
    }
}

结果如下

【问题讨论】:

  • 你正在使用 drawable.get(position) 声明可绘制的地方??
  • 全局声明为 public static ArrayList drawable;
  • 问题很简单,你过滤了你的文本数据但你没有过滤你的图像数据,这就是你的问题..
  • 所以你帮我这样做??

标签: android filter android-listview android-arrayadapter


【解决方案1】:

你可以看看这个参考。

这已解决,并且按照您的要求工作。

Search Filtering List View

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

编辑:

您必须维护一个与drawable ArrayList 相同的dummy_drawable ArrayList,并且只保留您的drawable ArrayList 作为基础并在您的适配器中使用dummy_drawable

还可以从您的 FilterResults 方法更新此 dummy_drawable ArrayList。像这样:

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));                 
        }
}

谢谢。

【讨论】:

  • 我试过你的链接,但它不起作用。实际上,我正在获取过滤后的列表,但未过滤图像。意味着如果我在过滤列表中获得 2 个列表项,那么图像在获得过滤列表之前的顺序相同。虽然数据来得正是时候..
  • @shivanipatel 你的drawable ArrayList 没有从你的FilterResults 方法更新。尝试这样做,我认为这是您的代码的唯一问题。
  • @shivanipatel 查看我发布的已编辑解决方案,您可以这样做。谢谢
  • @shivanipatel 嗯,现在很混乱。你能把你正在实施的小代码sn-p发给我吗?这样可以轻松快速地解决您的问题。
  • @shivanipatel 我发回邮件给你检查一下。
【解决方案2】:

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

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

Example 1

Example 2

【讨论】:

    【解决方案3】:

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

    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();
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2013-06-18
      • 1970-01-01
      • 2012-12-18
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多