Как французский разработчик, я прошу прощения за мой английский.
Итак, моя цель - создать телефонную книгу для моего приложения для Android. Эта телефонная книга состоит из ListView. Я заполнил свой ListView специальным адаптером, который позволяет пользователю выбирать некоторые текстовые элементы в каждой строке. Я предполагаю, что картина лучше тысячи слов, так вот вот:
Как вы можете видеть, красные части - это 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);
}
Причиной такого поведения является использование convertview. Чтобы решить эту проблему, используйте HashSet и поместите все позиции, выбранные в HashSet. В контроле getView содержатся элементы Hashset и setSelected для TextView. Надеюсь это поможет.
Добавить
if (selectedLocations.get(position).booleanValue())
{
location.setBackgroundColor(Color.RED);
}
else
{
location.setBackgroundColor(Color.TRANSPARENT);
}
вне onClickListener также обеспечить, чтобы convertView не повлиял на ваше требование.