Пользовательская ошибка SimpleCursorAdapter - PullRequest
0 голосов
/ 03 января 2012

У меня есть ListView в моей деятельности и пользовательский SimpleCursorAdapter.Пользовательский SimpleCursorAdapter выглядит следующим образом.

public class MySimpleCursorAdapter extends SimpleCursorAdapter {

    private Activity activity;
    private Cursor cursor;

public MySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to, Activity activity) {

    super(context, layout, c, from, to);
    this.activity = activity;
    this.cursor = c;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;
    if (view == null)
    view = View.inflate(this.activity,
         com.tour.R.layout.third_level_list_item, null);

    cursor.moveToPosition(position);

String hotelName=cursor.getString(cursor.getColumnIndexOrThrow(TodoDbAdapter.KEY_HOTEL));
String stars = cursor.getString(cursor.getColumnIndexOrThrow(TodoDbAdapter.KEY_ROW_STARS));
int numberOfStars = Integer.parseInt(stars);

TextView hotel = (TextView) view.findViewById(com.tour.R.id.hotel);
    if (hotel != null)
        hotel.setText(hotelName);

    ImageView[] images = new ImageView[5];
    images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1);
    images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2);
    images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3);
    images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4);
    images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5);

    for (int i = 0; i < numberOfStars; i++)
        images[i].setVisibility(View.VISIBLE);

    return view;

}

}

Адаптер CustomSimpleCursor настроен как адаптер списка.

Код работает отлично, название отеля в порядке, звезды в порядке, нопроблема в том, что после прокрутки списка какое-то время каждый отель получает 5 звезд, и я знаю, что это правда.

Любая помощь, как управлять количеством звезд в этом списке Просмотр из базы данных.Благодаря.

Ответы [ 2 ]

1 голос
/ 03 января 2012

Я думаю, вам просто нужно убедиться, что вы чистите свое состояние.Ваш адаптер делает звезды видимыми, как показывают ваши данные.Однако это никогда не делает их УТВЕРЖДЕННЫМИ / НЕВИДИМЫМИ, когда это не так.

ImageView[] images = new ImageView[5];
    images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1);
    images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2);
    images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3);
    images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4);
    images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5);

    for (ImageView image : images) {
        image.setVisibility(View.INVISIBLE);
    }

    for (int i = 0; i < numberOfStars; i++)
        images[i].setVisibility(View.VISIBLE);

Также, если вы хотите, вы можете кэшировать этот массив ImageView, чтобы избежать затрат на поиск обхода дерева при каждом связывании ячейки.Нравится:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;
    if (view == null) {
       view = View.inflate(this.activity, com.tour.R.layout.third_level_list_item, null);
        ImageView[] images = new ImageView[5];
        images[0] = (ImageView) view.findViewById(com.tour.R.id.slika1);
        images[1] = (ImageView) view.findViewById(com.tour.R.id.slika2);
        images[2] = (ImageView) view.findViewById(com.tour.R.id.slika3);
        images[3] = (ImageView) view.findViewById(com.tour.R.id.slika4);
        images[4] = (ImageView) view.findViewById(com.tour.R.id.slika5);
        view.setTag(images);
    }

    ImageView[] images = (ImageView[]) view.getTag();
    for (ImageView image : images) {
      image.setVisibility(View.INVISIBLE);
    }

    for (int i = 0; i < numberOfStars; i++)
      images[i].setVisibility(View.VISIBLE);

    return view;
 }
0 голосов
/ 03 января 2012

Вы никогда не делаете звезды невидимыми. Это должно быть что-то вроде:

for (int i = 0; i < numberOfStars; i++)
    images[i].setVisibility(View.VISIBLE);

for (int i = numberOfStars; i < 5; i++)
    images[i].setVisibility(View.INVISIBLE);

Все, что говорится:

  • Рассмотрите возможность использования RatingBar вместо отдельных звезд
  • Попробуйте использовать шаблон держателя, чтобы не выполнять все эти findViewById() вызовы в каждой строке
  • Подумайте о том, чтобы позвонить getInt() вместо getString() и затем преобразовать его в int себя
  • Поскольку это CursorAdapter, в идеале вы должны переопределять newView() и bindView(), а не getView()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...