2016-09-28 2 views
0

Итак, у меня есть свой пользовательский ListView с TextView слева и ImageView с правой стороны. Он показывает продукты, которые можно проверить любимым. Поэтому, когда продукт является любимым, он показывает световую звезду, и когда он не показывает темную звезду.Custom Listview, первый ряд неверен

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 

затем первая позиция все еще СВЕТ, потому что вторая и третья. Мне нужно установить второй и темный, чтобы установить темную темноту. :(

+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"); 
} 

ИЛИ

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, но родительский элемент равен null, сам адаптер добавляет родительскую строкуView.

Заменить это private static class ViewHolder.

С новым 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)); 
}