2012-11-14 2 views
0

У меня есть пользовательский SimpleCursorAdapter в DialogFragment, и у меня возникли проблемы с пониманием использования setTag и getTag. Из моего вывода LogCat кажется, что я устанавливаю тэг в LinearLayout и пытаюсь извлечь тег из Button. Как настроить целевой компонент для доступа к тегу в ClickListener?ViewHolder на неправильном компоненте в vustom SimpeCursorAdapater

@Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     if (mCursor.moveToPosition(position)) { 
      ViewHolder holder; 
      final String label; 
      final int label_index = mCursor.getColumnIndex(ProfilesColumns.USERNAME); 
      label = mCursor.getString(label_index); 

      if (convertView == null) { 
       convertView = mInflater.inflate(layout, null); 

       holder = new ViewHolder(); 
       holder.name = (Button) convertView.findViewById(R.id.title); 
       holder.logout = (Button) convertView.findViewById(R.id.logout); 
       holder.id = getItemId(position); 
       convertView.setTag(holder); 
       Log.d(DEBUG_TAG, "getView view " + convertView);//Returns LinearLayout 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.logout.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(final View v) { 
        ViewHolder holder; 
        if (v == null) { 
         Log.d(DEBUG_TAG, "logout view null "); 
        } else { 
         Log.d(DEBUG_TAG, "logout view " + v);//Returns Button 
         holder = (ViewHolder) v.getTag(); 
         if (holder == null) { 
          Log.d(DEBUG_TAG, "logout holder null "); 
         } else { 
          Log.d(DEBUG_TAG, "logout holder.id " + holder.id); 
          String[] argument = { "" + holder.id }; 
          ContentResolver cr = getActivity().getContentResolver(); 
          int count = cr.delete(ProfileProvider.URI_LOADEDPROFILETABLE, CommonDatabaseHelper._ID 
            + "=?", argument); 
          Log.d(DEBUG_TAG, "logout count  " + count); 
         } 
        } 
       } 
      }); 
     } 
     return convertView; 

    } 

Вот макет, profileselect_list_item:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:padding="0dp" > 

<Button 
    android:id="@+id/title" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" /> 

<Button 
    android:id="@+id/logout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/logout" /> 

</LinearLayout> 
+0

Перед тем, как смотреть: вам не нужно проверять, нет ли вашего представления в onClick .. должно присутствовать представление для запуска этого onClick, поэтому оно никогда не будет равно null. Просто немного подсказки – dymmeh

ответ

3

Короткий ответ в том, что вы не использовали setTag() на кнопках, вы использовали его на родителя LinearLayout. Так внутри вашей OnClickListener изменить:

holder = (ViewHolder) v.getTag(); 

к:

holder = (ViewHolder) ((View) v.getParent()).getTag(); 

Кроме этой линии:

holder.id = getItemId(position); 

изменения для каждой строки, в то время как OnClickListener нет. Вы должны переместить указанную выше линию за пределами из if(convertView == null) и переместить OnClickListener внутри.


Чем дольше ответ
Вы расширяя CursorAdapter, у них есть три большие методы newView(), bindView() и getView().

  • newView() создает новые виды. Переопределите этот метод и переместите весь свой код if(convertView == null) { ... }.

  • bindView() имеет прямой доступ к курсору. Кажется, метод в SimpleCursorAdapter по умолчанию берет на себя это для вас ...

  • Перекрытие getView() не всегда необходимо из-за удивительности newView() и bindView().

+0

Большое вам спасибо. Отличный ответ, я новичок в bindView/newView, но не был уверен, использовать ли их в SimpleCursorAdapter. И фрагмент работает так, как ожидалось! – KrisC