过滤记录后获取自定义gridView项的正确位置

时间:2016-10-06 06:16:23

标签: java android

在自定义filter gridView上应用productsListHolder.add_to_cart.setOnClickListener后未获得正确的项目位置,它会根据之前的排列提供过滤记录之前的结果。 过滤后如何才能获得正确的gridView项?

  

我想知道Filterable是如何运作的?

public class GridAdapter extends BaseAdapter implements Filterable {

public interface BtnClickListener {
    public abstract void onBtnClick(String position);
}
private BtnClickListener mClickListener = null;
Context context;
private ArrayList<Products> filteredProducts;
private ArrayList<Products> products;
private ItemFilter prodFilter = null;
private LayoutInflater inflater;
public GridAdapter(Context context, ArrayList<Products> products, BtnClickListener listener) {
    this.context = context;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.products = products;
    this.filteredProducts = products;
    mClickListener = listener;
}
public class ProductsListHolder{
    public ImageView prod_img;
    public TextView prod_price;
    public Button prod_cart;
    public TextView prod_desc;
    public Button add_to_cart;
}
public ArrayList<Products> getProducts() {
    return products;
}
public void setProducts(ArrayList<Products> products) {
    this.products = products;
}

public GridAdapter(){
}
@Override
public int getCount() {
    if(products!=null)
        return products.size();
    return 0;
}
@Override
public Object getItem(int position) {
    if(products!=null && position >=0 && position<getCount() )
        return products.get(position);
    return null;
}
@Override
public long getItemId(int position) {
    if(products!=null && position >=0 && position<getCount() ){
        Products temp = products.get(position);
        return products.indexOf(temp);
    }
    return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ProductsListHolder productsListHolder;

    if(view == null){
        view = inflater.inflate(R.layout.product_adapter, parent, false);
        productsListHolder = new ProductsListHolder();
        productsListHolder.prod_img = (ImageView) view.findViewById(R.id.prod_img);
        productsListHolder.prod_price = (TextView) view.findViewById(R.id.prod_price);
        productsListHolder.prod_desc = (TextView) view.findViewById(R.id.prod_desc);
        productsListHolder.add_to_cart = (Button) view.findViewById(R.id.add_to_cart);
        productsListHolder.add_to_cart.setTag(products.get((int) getItemId(position)).getId());
        view.setTag(productsListHolder);
    }
        else{
        productsListHolder = (ProductsListHolder) view.getTag();
    }
    productsListHolder.add_to_cart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mClickListener != null)
                mClickListener.onBtnClick((String) v.getTag());
        }
    });
        Products product = products.get(position);
        setProduct(position,productsListHolder,product);
    return view;
}

private void setProduct(int position, final ProductsListHolder productsListHolder, Products p) {
    Picasso.with(context).load(p.getImageResours()).into(new Target(){

        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            productsListHolder.prod_img.setBackground(new BitmapDrawable(context.getResources(), bitmap));
        }
        @Override
        public void onBitmapFailed(final Drawable errorDrawable) {
        }
        @Override
        public void onPrepareLoad(final Drawable placeHolderDrawable) {
        }
    });
    productsListHolder.prod_price.setText("Rs: ".concat(Integer.toString(p.getPrice())));
    productsListHolder.prod_desc.setText(p.name);
}
@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}
@Override
public Filter getFilter() {
    if(prodFilter == null)
        prodFilter = new ItemFilter();
    return prodFilter;
}
private class ItemFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toUpperCase();
        FilterResults results = new FilterResults();
        final ArrayList<Products> list = filteredProducts;
        int count = list.size();
        final ArrayList<Products> nlist = new ArrayList<Products>(count);
        Products filtPro;
        if (constraint == null || constraint.length() == 0) {
            results.values = filteredProducts;
            results.count = filteredProducts.size();
        }
        else {
            for (int i = 0; i < count; i++) {
                filtPro = list.get(i);
                if (filtPro.getName().toUpperCase().contains(filterString)) {
                    nlist.add(filtPro);
                }
            }
            results.values = nlist;
            results.count = nlist.size();
        }
        return results;
    }
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        products = (ArrayList<Products>) results.values;
        notifyDataSetChanged();
    }
}

}

0 个答案:

没有答案