Android ListView不显示任何数据

Android ListView不显示任何数据,android,listview,baseadapter,Android,Listview,Baseadapter,我正在使用Tim Roes的库,并使用扩展BaseAdapter的自定义适配器 我的问题是我无法让ListView显示任何数据,我认为这与notifyDataSetChanged()不工作有关 以下是初始化ListView和适配器的方式: public class FragmentProducts extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener, EnhancedL

我正在使用Tim Roes的库,并使用扩展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
}
公共类FragmentProducts扩展了片段实现View.OnClickListener,
AdapterView.OnItemClickListener,
EnhancedListView.OnDismissCallback,
SearchView.OnQueryTextListener,
SearchView.OnCloseListener,
AbsListView.OnScrollListener{
公共静态最终int段编号=9;
公共静态布尔ISCROLING;
按钮扫描按钮;
SearchView搜索产品;
增强ListView产品列表;
产品适配器数据适配器;
名单;
OnProductSelectedListener McCallback;
静态产物聚丙烯;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment_产品,容器,假);
如果(视图!=null){
searchProducts=(SearchView)view.findViewById(R.id.search\u product);
scanButton=(Button)view.findviewbyd(R.id.scanButton);
productsList=(EnhancedListView)view.findViewById(R.id.products\u列表);
searchProducts.setOnQueryTextListener(此);
scanButton.setOnClickListener(这个);
productsList.setOnScrollListener(此);
productsList.setOnItemClickListener(此);
productsList.setDismissCallback(此);
productsList.enableSwipeToDismiss();
productsList.SetRequiredTouchBeforeDisclose(false);
列表=新的ArrayList();
dataAdapter=new ProductsAdapter(getActivity(),list);
productsList.setAdapter(dataAdapter);
大众主义者();
}
返回视图;
}
公共无效公共列表(){
list.addAll(Product.getAll(getActivity());
//从数据库加载项目
dataAdapter.notifyDataSetChanged();
LogUtil.addCheckpoint(list.size()+“产品列表上的项目”);
//此处列表的大小正确,但适配器未更新
}
下面是我的适配器实现:

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;
}
}
公共类ProductsAdapter扩展BaseAdapter{
私人语境;
私人上市产品;
产品的私有列表副本;
公共产品适配器(上下文,列出产品){
超级();
this.context=上下文;
this.products=new ArrayList();
this.products.addAll(产品);
this.copyOfProducts=newArrayList();
此.copyOfProducts.addAll(产品);
}
@凌驾
公共对象getItem(int i){
退货。获取(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
public int getCount(){
int count=products.size();
LogUtil.addCheckpoint(计数+“产品适配器上的项”);
//此处的项目计数始终为0
返回计数;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
布尔isScrolling=碎片产品。isScrolling;
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.item_产品,父项,假);
holder=新的ViewHolder();
holder.productName=(TextView)convertView.findViewById(R.id.product\u名称);
holder.productBrand=(TextView)convertView.findViewById(R.id.product\u brand);
holder.productPrice=(TextView)convertView.findViewById(R.id.product\u price);
holder.productStock=(TextView)convertView.findViewById(R.id.product\u stock);
holder.productImage=(ImageView)convertView.findViewById(R.id.product\u image);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
产品项=产品。获取(位置);
holder.position=位置;
holder.productId=item.getId();
holder.productName.setText(item.getName());
holder.productBrand.setText(item.getBrand());
十进制格式=新的十进制格式(“0.00”);
holder.productPrice.setText(“$”+form.format(item.getPrice());
holder.productStock.setText(String.valueOf(item.getStock());
新建异步任务(){
私人持票人;
@凌驾
受保护的位图背景(ViewHolder…ViewHolder){
viewHolder=viewHolder[0];
返回ProductPic.getMainForProduct(上下文,viewHolder.productId);
}
@凌驾
受保护的void onPostExecute(位图){
onPostExecute(位图);
if(viewHolder.position==位置)
viewHolder.productImage.setImageBitmap(位图);
}
}.执行(持有人);
动画;
如果(ISCROLING){
animation=AnimationUtils.loadAnimation(上下文,右起R.anim.slide);
动画。设置持续时间(400);
convertView.startAnimation(动画);
}
返回视图;
}
公共void filterProducts(字符串查询){
query=query.toLowerCase();
产品;
if(query.isEmpty()){
products.addAll(产品副本);
}否则{
用于(产品项:产品副本)
{
if(item.getName().toLowerCase().contains)(查询)
||item.getBrand().toLowerCase().contains(查询)
||item.getCode().contains(查询)){
如果(!products.contains(项目))
产品。添加(项目);
}
}
}
notifyDataSetChanged();
}
静态类视窗夹{
TextView产品名称;
TextView产品品牌;
文本视图产品价格;
TextView产品库存;
图像视图产品图像;
内部位置;
int-productId;
}
}

你知道我遗漏了什么吗?

检查listview的高度值。

终于找到了答案

在适配器的构造函数上,我有以下内容:

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);
}
我让ListView工作了

我希望
    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;