Android - проблема с ListView

1

Как французский разработчик, я прошу прощения за мой английский.

Итак, моя цель - создать телефонную книгу для моего приложения для Android. Эта телефонная книга состоит из ListView. Я заполнил свой ListView специальным адаптером, который позволяет пользователю выбирать некоторые текстовые элементы в каждой строке. Я предполагаю, что картина лучше тысячи слов, так вот вот:

Изображение 174551

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

Когда я выбираю TextView из строки, строка, которая имеет 4 места, имеет свой TextView, который также выбирается! Это обычная проблема или это связано с моим кодом?

Я добавил журнал на прослушиватель кликов, для каждого щелчка TextView я получаю только один журнал, поэтому я не думаю, что проблема связана с моей работой.

Например, и если некоторые из вас не понимают, что я сказал; Я выбираю TextView с рисунком drawableLeft во второй строке. Logcat возвращает мне следующую запись: "Выбрать: 1" (как определено в моем коде). Если я прокручу вниз свой ListView, я вижу, что моя вторая строка (т.е. Мой TextView) выбрана так, как ожидалось, но также и моя 6-я строка, чего не ожидается вообще!

Вот код, который я использую для того, чтобы цвет или не строка:

public View getView(final int position, View convertView, ViewGroup parent)
{
    selectedLocations.add(new Boolean(false));
    selectedAvailabilities.add(new Boolean(false));

    if (convertView == null) convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false);

    final LinearLayout root = (LinearLayout) convertView.findViewById(R.id.phonebook_adapter_root);
    final ImageView photo = (ImageView) convertView.findViewById(R.id.phonebook_adapter_image);
    final TextView firstname = (TextView) convertView.findViewById(R.id.phonebook_adapter_firstname);
    final TextView lastname = (TextView) convertView.findViewById(R.id.phonebook_adapter_lastname);
    final TextView location = (TextView) convertView.findViewById(R.id.phonebook_adapter_location);
    final TextView availability = (TextView) convertView.findViewById(R.id.phonebook_adapter_availability);

    Bitmap mBitmap = null;
    try
    {
        mBitmap = Media.getBitmap(context.getContentResolver(), Uri.parse(relations.get(position).getPhoto()));
        photo.setImageBitmap(mBitmap);
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    firstname.setText(relations.get(position).getFirstName());
    lastname.setText(relations.get(position).getLastName());

    DBStatus dbStatus = new DBStatus(KramerApplication.getInstance());
    Status status = dbStatus.getWithRelation(relations.get(position));
    dbStatus.close();

    if (status != null)
    {           
        location.setText( status.getLocation() );
        availability.setText( status.getAvailability() );

        if ( status.getDisplayedAvailability(2).equals("Busy") )
            availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_busy, 0, 0, 0);
        else if ( status.getDisplayedAvailability(2).equals("Occupied") )
            availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_busy, 0, 0, 0);
        else if ( status.getDisplayedAvailability(2).equals("Free") )
            availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_on, 0, 0, 0);
        else
            availability.setCompoundDrawablesWithIntrinsicBounds(R.drawable.availability_off, 0, 0, 0);
    }

    root.setOnClickListener(new OnClickListener() {
        public void onClick(View v)
        {
            Intent intent = new Intent(context, ContactDetailsActivity.class);
            intent.putExtra("contact_id", relations.get(position).getId());
            context.startActivity(intent);
        }
    });

    location.setOnClickListener(new OnClickListener() {
        public void onClick(View v)
        {
            if (selectedLocations.get(position).booleanValue())
            {
                selectedLocations.set(position, new Boolean(false));
                location.setBackgroundColor(Color.TRANSPARENT);
            }
            else
            {
                selectedLocations.set(position, new Boolean(true));
                location.setBackgroundColor(Color.RED);
            }
        }
    });
    availability.setOnClickListener(new OnClickListener() {
        public void onClick(View v)
        {
            if (selectedAvailabilities.get(position).booleanValue())
            {
                selectedAvailabilities.set(position, new Boolean(false));
                availability.setBackgroundColor(Color.TRANSPARENT);
            }
            else
            {
                selectedAvailabilities.set(position, new Boolean(true));
                availability.setBackgroundColor(Color.RED);
            }
        }
    });

    return convertView;
}

"ArrayLists" "selectedAvailabilities" и "selectedLocations" были правильно инициализированы в конструкторе и выполняли свои задания, когда я использую их в другом действии (только для чтения).

Надеюсь, ты сможешь мне помочь.

С уважением.

V.

################################# РЕШЕНИЕ

Если кто-то ищет решение, вот оно. Большое спасибо user936414 !.

Заменить (строка 6):

if (convertView == null) convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false);

От:

convertView = inflater.inflate(R.layout.phonebook_adapter_layout, parent, false);

До:

return convertView;

Добавить:

if (selectedAvailabilities.get(position).booleanValue())
{
    availability.setBackgroundColor(Color.RED);
}
if (selectedLocations.get(position).booleanValue())
{
    location.setBackgroundColor(Color.RED);
}
Теги:
listview

1 ответ

4
Лучший ответ

Причиной такого поведения является использование convertview. Чтобы решить эту проблему, используйте HashSet и поместите все позиции, выбранные в HashSet. В контроле getView содержатся элементы Hashset и setSelected для TextView. Надеюсь это поможет.

Добавить

 if (selectedLocations.get(position).booleanValue())
 {
           location.setBackgroundColor(Color.RED);
 }
 else
 {

            location.setBackgroundColor(Color.TRANSPARENT);
 }

вне onClickListener также обеспечить, чтобы convertView не повлиял на ваше требование.

  • 0
    Ну, я не понимаю, зачем использовать HashSet, если у меня есть ArrayList, который делает эту работу! В чем проблема с использованием convertView?
  • 0
    Когда вы прокручиваете конвертированный вид предыдущего вида, он отображается здесь. Вот почему здесь отражается позиция, выбранная в конвертируемом виде перед прокруткой.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню