ListView没有显示任何数据

时间:2014-06-24 16:50:54

标签: android listview baseadapter

我正在使用Tim Roes的EnhancedListView库并使用扩展BaseAdapter的自定义适配器。

我的问题是我无法让ListView显示任何数据,我相信它与notifyDataSetChanged()无法正常工作。

这是我初始化ListView和适配器的方式:

public class FragmentProducts extends Fragment implements View.OnClickListener,
    AdapterView.OnItemClickListener,
    EnhancedListView.OnDismissCallback,
    SearchView.OnQueryTextListener,
    SearchView.OnCloseListener,
    AbsListView.OnScrollListener{

public static final int SECTION_NUMBER = 9;
public static boolean isScrolling;
Button scanButton;
SearchView searchProducts;
EnhancedListView productsList;
ProductsAdapter dataAdapter;
List<Product> list;
OnProductSelectedListener mCallback;

static Product pp;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_products, container, false);

    if (view != null) {
        searchProducts = (SearchView) view.findViewById(R.id.search_product);
        scanButton = (Button) view.findViewById(R.id.scanButton);
        productsList = (EnhancedListView) view.findViewById(R.id.products_list);

        searchProducts.setOnQueryTextListener(this);
        scanButton.setOnClickListener(this);

        productsList.setOnScrollListener(this);
        productsList.setOnItemClickListener(this);
        productsList.setDismissCallback(this);
        productsList.enableSwipeToDismiss();
        productsList.setRequireTouchBeforeDismiss(false);

        list = new ArrayList<Product>();
        dataAdapter = new ProductsAdapter(getActivity(), list);
        productsList.setAdapter(dataAdapter);

        populateList();
    }
    return view;
}

public void populateList() {
    list.addAll(Product.getAll(getActivity()));
    //Load the items from DataBase

    dataAdapter.notifyDataSetChanged();

    LogUtil.addCheckpoint(list.size() + " items on the product list");
    //The size of the list here is correct, but the adapter is not updating
}

这是我的适配器实现:

public class ProductsAdapter extends BaseAdapter {

private Context context;
private List<Product> products;
private List<Product> copyOfProducts;

public ProductsAdapter(Context context, List<Product> products) {

    super();

    this.context = context;
    this.products = new ArrayList<Product>();
    this.products.addAll(products);
    this.copyOfProducts = new ArrayList<Product>();
    this.copyOfProducts.addAll(products);
}

@Override
public Object getItem(int i) {
    return products.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public int getCount() {
    int count = products.size();
    LogUtil.addCheckpoint(count + " items on the products adapter");
    //Item count is always 0 here
    return count;
}

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

    ViewHolder holder;
    Boolean isScrolling = FragmentProducts.isScrolling;

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.item_products, parent, false);

        holder = new ViewHolder();
        holder.productName = (TextView) convertView.findViewById(R.id.product_name);
        holder.productBrand = (TextView) convertView.findViewById(R.id.product_brand);
        holder.productPrice = (TextView) convertView.findViewById(R.id.product_price);
        holder.productStock = (TextView) convertView.findViewById(R.id.product_stock);
        holder.productImage = (ImageView) convertView.findViewById(R.id.product_image);

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

    Product item = products.get(position);
    holder.position = position;
    holder.productId = item.getId();
    holder.productName.setText(item.getName());
    holder.productBrand.setText(item.getBrand());
    DecimalFormat form = new DecimalFormat("0.00");
    holder.productPrice.setText("$" + form.format(item.getPrice()));
    holder.productStock.setText(String.valueOf(item.getStock()));

    new AsyncTask<ViewHolder, Void, Bitmap>() {

        private ViewHolder viewHolder;

        @Override
        protected Bitmap doInBackground(ViewHolder... viewHolders) {
            viewHolder = viewHolders[0];
            return ProductPic.getMainForProduct(context, viewHolder.productId);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);

            if (viewHolder.position == position)
                viewHolder.productImage.setImageBitmap(bitmap);
        }
    }.execute(holder);

    Animation animation;
    if (isScrolling) {
        animation = AnimationUtils.loadAnimation(context, R.anim.slide_from_right);
        animation.setDuration(400);
        convertView.startAnimation(animation);
    }

    return convertView;
}

public void filterProducts(String query) {

    query = query.toLowerCase();
    products.clear();

    if (query.isEmpty()) {
        products.addAll(copyOfProducts);
    } else {
        for (Product item : copyOfProducts)
        {
            if (item.getName().toLowerCase().contains(query)
                    || item.getBrand().toLowerCase().contains(query)
                    || item.getCode().contains(query)) {
                if (!products.contains(item))
                    products.add(item);
            }
        }
    }
    notifyDataSetChanged();
}

static class ViewHolder {

    TextView productName;
    TextView productBrand;
    TextView productPrice;
    TextView productStock;
    ImageView productImage;
    int position;
    int productId;
}
}

关于我缺少的任何想法?

2 个答案:

答案 0 :(得分:0)

检查列表视图的高度值。

答案 1 :(得分:0)

终于明白了!

在适配器的构造函数上我有这个:

public ProductsAdapter(Context context, List<Product> products) {

    super();

    this.context = context;
    this.products = new ArrayList<Product>();
    this.products.addAll(products);
    this.copyOfProducts = new ArrayList<Product>();
    this.copyOfProducts.addAll(products);
}

并将其更改为:

    public ProductsAdapter(Context context, List<Product> products) {

        super();
        this.context = context;
        this.products = products; //<- This is where the error was
        copyOfProducts = new ArrayList<Product>();
    }

我在开始时通过添加原始列表初始化列表,而不是引用它,当然当我更改原始列表时,适配器没有注意到它是我在上面创建的列表构造函数永远不会改变。

通过更改

    this.products = new ArrayList<Product>();
    this.products.addAll(products);

this.products = products;

我让ListView工作。

我希望这有助于其他人面临类似的问题。

相关问题