2016-09-28 18 views
0

所以我确实有我的自定义ListViewTextView在左侧和ImageView在右侧。它显示可以检查喜爱的产品。所以当产品最喜欢它时,它会显示光明星,当它不显示时,它会显示黑暗的星星。自定义列表视图,第一行是不正确的

Everthing很好地期待第一行。当第一行被选为收藏夹时,一切正常。但是当它被选择为不喜欢的时候,当任何其他产品也有亮星时它仍然有一颗亮星。为了将第一个星星颜色设置为黑暗,我需要将所有产品设置为不喜欢的。

我试图调试它,但我的日志显示,一切都很好......我无法找到任何合理的答案为什么发生在我身上,所以我来到这里。我发布了一些代码。

适配器

public class ProductsWithFavAdapter extends ArrayAdapter<Products>{ 
private Activity context; 
private List<Products> products; 
public ProductsWithFavAdapter(Activity context, List<Products> products) { 
    super(context, R.layout.product_with_fav, products); 
    this.context = context; 
    this.products = products; 
} 

private class ViewHolder { 
    public TextView productName; 
    public ImageView imageFav; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder viewHolder; 
    View rowView = convertView; 
    if(rowView == null) { 
     LayoutInflater layoutInflater = context.getLayoutInflater(); 
     rowView = layoutInflater.inflate(R.layout.product_with_fav, null, true); 
     viewHolder = new ViewHolder(); 
     viewHolder.productName = (TextView) rowView.findViewById(R.id.textView1); 
     viewHolder.imageFav = (ImageView) rowView.findViewById(R.id.imageView2); 
     rowView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) rowView.getTag(); 
    } 
    Products product = products.get(position); 

    if(product.isFav()) { 
     viewHolder.imageFav.setImageResource(R.drawable.fav_light); 
     Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET LIGHT"); 
    } else { 
     viewHolder.imageFav.setBackgroundResource(R.drawable.fav_dark); 
     Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET DARK"); 
    } 

    viewHolder.productName.setText(product.getName()); 

    return rowView; 
} 

活动

products.clear(); 
      favProductsTriggered = !favProductsTriggered; 

      String searchProductText = searchProduct.getText().toString(); 
      boolean searchingProduct = false; 

      if(!searchProductText.equals("") && !searchProductText.isEmpty()) { 
       searchingProduct = true; 
      } 

      ProductsDbAdapter adapterProducts = new ProductsDbAdapter(getActivity()); 
      adapterProducts.open(); 
      final Cursor cursorProducts = adapterProducts.getAllProducts(); 

      if(cursorProducts != null && cursorProducts.moveToFirst()) { 
       do { 
        int id = cursorProducts.getInt(ProductsDbAdapter.ID_COLUMN); 
        String name = cursorProducts.getString(ProductsDbAdapter.NAME_COLUMN); 
        boolean fav = cursorProducts.getInt(2) != 0; 
        products.add(new Products(id, name, 0, 0, fav)); 
        Log.d("wwFAV " + Integer.toString(cursorProducts.getPosition()), Integer.toString(cursorProducts.getInt(2))); 
       } while(cursorProducts.moveToNext()); 
      } 

      ProductsWithFavAdapter listProductsAdapter = new ProductsWithFavAdapter(getActivity(), products); 
      lvProducts = (ListView) ll.findViewById(R.id.listView3); 
      lvProducts.setAdapter(listProductsAdapter); 

,现在来看,日志。当他们显示:

AdaptFAV 0 bułka pszenna: 0 SET DARK 
AdaptFAV 1 płatki owsiane: 1 SET LIGHT 
AdaptFAV 2 bułka jęczmienna: 1 SET LIGHT 

然后第一个位置仍然是LIGHT,因为第二个和第三个是。我需要设置第二个,黑暗到黑暗,以设置第一个黑暗。 :(

+0

提供活动和适配器的全部代码,因为我不能够看到onClickListener的最爱/ Unfav –

+0

解决了下面的回答,谢谢无论如何! – Tomek

回答

3

任何原因isfav()使用的是setImageResource和其他部分为setBackgroundResource()

+0

你是我的英雄!没有注意到! – Tomek

+1

很高兴帮助.... –

0

您应该使用

if(product.isFav()) { 
    viewHolder.imageFav.setImageResource(R.drawable.fav_light); 
    Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET LIGHT"); 
} else { 
    viewHolder.imageFav.setImageResource(R.drawable.fav_dark); 
    Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET DARK"); 
} 

OR

if(product.isFav()) { 
    viewHolder.imageFav.setBackgroundResource(R.drawable.fav_light); 
    Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET LIGHT"); 
} else { 
    viewHolder.imageFav.setBackgroundResource(R.drawable.fav_dark); 
    Log.d("AdaptFAV " + Integer.toString(position) + " " + product.getName(), Integer.toString(product.isFav() ? 1 : 0) + " SET DARK"); 
} 
+0

是的,我知道的权利。以前的用户告诉我,我使用了两种不同的。无论如何谢谢你! – Tomek

0

删除裁判活动从适配器更改context.getLayoutInflater();LayoutInflater.from(parent.getContext());rowView = layoutInflater.inflate(R.layout.product_with_fav, parent, false);现在您指定要添加到参数ent,但父母为空,适配器本身添加到父级rowView。

替换这个private static class ViewHolder

现在不推荐使用新的android API 22 getResources().getDrawable()。使用ContextCompat.getDrawable(getActivity(), R.drawable.name);

你会选择使用setImageResource或setBackgroundResource。

创建适配器,然后在数据不正确时进入列表视图。适配器:

public ProductsWithFavAdapter(Context context, List<Products> products) { 
    super(context, R.layout.product_with_fav, products); 
    this.products = new ArrayList<>(products); 
} 
public void setProducts(List<Products> newProducts) { 
    this.products.clear(); 
    this.products.addAll(newProducts); 
    notifyDataSetChanged(); 
} 

当您更改数据,使用:

lvProducts = (ListView) ll.findViewById(R.id.listView3); 
ListAdapter adapter = lvProducts.getAdapter(); 
if (adapter instanceof ProductsWithFavAdapter) { 
    ((ProductsWithFavAdapter) adapter).setProducts(newProducts); 
} else { 
    lvProducts.setAdapter(new ProductsWithFavAdapter(this, newProducts)); 
}