Android: ViewBinder — изменение столбцов ListView размером больше содержимого курсора

#android #listview #cursor #simplecursoradapter

#Android #просмотр списка #курсор #simplecursoradapter

Вопрос:

У меня есть ListView, который показывает 3 значения из базы данных SQLite (столбцы 1, 2 и 3). Справа от этих значений я хочу поместить несколько кнопок изображения. Мой вопрос — как мне изменить то, что отображается в столбцах 4 и выше?

Я переопределил setViewValue(), но это вызывается только для столбцов в курсоре (вроде того, что я ожидал). Как я могу изменить то, что отображается в определенной строке для столбцов 4 и выше? Могу ли я как-то переопределить метод getView()? Если я использую SimpleCursorAdapter — означает ли это, что я должен создать подкласс SimpleCursorAdapter, а затем переопределить метод getView()?

Комментарии:

1. вам необходимо реализовать интерфейс ViewBinder, нет необходимости каким-либо образом расширять SCA

2. @pskink: ViewBinder, насколько я могу судить, имеет только метод setViewValue(), и, похоже, он не позволяет изменять значения, которых нет в курсоре.

3. @pskink: Единственная идея, о которой я могу думать, — это получить доступ к родительскому представлению всякий раз, когда вызывается setViewValue(), а затем найти представления для столбцов 4 и выше.

4. посмотрите на первый параметр представления setViewValue, это представление, в которое вам нужно сопоставить свои данные

Ответ №1:

Вот как я это сделал:

   public class CustomViewBinder implements ViewBinder
  {
    @Override
    public boolean setViewValue( View view, Cursor cursor, int columnIndex )
    {
      if( columnIndex == 1 )
      {
        View vParent = (View) view.getParent();

        ImageView ivPlaylist = (ImageView) vParent.findViewById( R.id.ibAddPlaylist );

        if( ivPlaylist != null )
        {  
          ivPlaylist.setImageResource( R.drawable.clipboard30x30purple );
        }
  

Комментарии:

1. почему view.getParent()?, Параметр «view» — это вид, который вы ищете

2. @pskink: Пример, который я использовал с ViewBinder, показывал список элементов со звездочкой рядом с ними. Парень установил представление. Состояние в представлении, на которое вы ссылаетесь, исчезло, и исчезла только звездочка ImageView, а не вся строка. Если я использую view вместо vParent, он выходит из строя.

3. если ваш курсор имеет столбец _id плюс три дополнительных столбца: c0, c1 и c2, и при создании SCA вы используете from = [«c0», «c1″,»c2»], а ваш latout имеет три TextViews с идентификаторами: tv0, tv1, tv2 и to = [tv0, tv1, tv2], то setViewValue будет вызываться три раза для каждой строки, каждый раз с другим TextView и другим ColumnIndex

4. @pskink: Правильно, но я хочу получить доступ к ImageViews iv3, iv4 и iv5, для которых в курсоре нет индекса столбца. Это произвольные просмотры изображений, которые напрямую не связаны с тем, что находится в курсоре. Мое решение работает нормально — я не хочу получать доступ к tv0, tv1 и tv2 — я хочу получить доступ к столбцам ListView за пределами диапазона to = [].

5. просто добавьте идентификаторы в массив «to» и добавьте поддельные столбцы, такие как _id, в массив «from», или, если вы считаете, что ViewBinder слишком сложен для переопределения BindView, обязательно вызовите super