【问题标题】:ListView not showing any dataListView 不显示任何数据
【发布时间】:2014-06-25 02:28:43
【问题描述】:

我正在使用 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;
}
}

关于我缺少什么的任何想法?

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:

    检查列表视图的高度值。

    【讨论】:

    • 如果是wrap_content,改成固定值或者match_parent
    • 感谢您的建议,但它已经设置为 match_parent
    • list = new ArrayList(); dataAdapter = new ProductsAdapter(getActivity(), list);此时您的列表为空,因此计数返回为 0。在 list.addAll() 之后再次分配您的适配器。
    • 我知道列表一开始是空的,但这就是为什么我打电话给dataAdapter.notifyDataSetChanged(); 虽然你的建议可能适用于短数据集,但当我有很多项目时,性能很糟糕。还是谢谢
    【解决方案2】:

    终于明白了!

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

    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 工作了。

    我希望这可以帮助其他面临类似问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多