Android ListView不显示任何数据
我正在使用Tim Roes的库,并使用扩展BaseAdapter的自定义适配器 我的问题是我无法让ListView显示任何数据,我认为这与notifyDataSetChanged()不工作有关 以下是初始化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
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;