2012-12-27 51 views
1

我是Android中的一个begginer,但我试图制作自定义listview过滤,并且我以某种方式工作。我唯一的问题是ArrayList,我有图像视图,当我搜索列表它的作品,但图像显示错误。我无法解释这一点,但我认为你能以某种方式帮助我。ListView中的自定义过滤ArrayAdapter不适用于图像视图

反正这里是自定义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(); 
    } 
} 

以下是结果

enter image description here enter image description here

+0

您使用** drawable.get(位置) **你在哪里声明drawable? –

+0

它被全局声明为public static ArrayList drawable; –

+0

问题很简单,你过滤你的文本数据,但你没有过滤你的图像数据,多数民众赞成你的问题.. –

回答

0

你可以看看这个参考。

这是解决和工作的东西相同根据您的要求。

Search Filtering List View

这个链接去通过,让我知道,如果你有问题,还是。

编辑:

你必须保持一个dummy_drawable ArrayList一样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));     
     } 
} 

谢谢。

+0

我已经尝试过你的链接,但它不起作用。实际上我得到过滤列表,但图像不被过滤。意味着如果我在筛选列表中获取2个列表项目,则图像在获得筛选列表之前以相同顺序排列。虽然数据正在合适.. –

+0

PLZ在已编辑的队列中看到快照... –

+0

@shivanipatel你的'drawable' ArrayList没有从你的'FilterResults'方法更新。试着这样做,我认为这是你的代码唯一的问题。 –

1

有很多例子与ImageView的搜索数据..

这里是一些很好的链接,请先阅读&了解代码之后再实现按您的要求。

Example 1

Example 2

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

    } 

} 
+0

这很好,你解决了它。 :) –

相关问题