0

我在 DialogFragment 中有一个自定义 SimpleCursorAdapter,我无法理解 setTag 和 getTag 的使用。从我的 LogCat 输出来看,我似乎在 LinearLayout 上设置标签并试图从 Button 中检索标签。如何定位正确的组件以访问 ClickListener 中的标签?

    @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>
4

1 回答 1

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()

于 2012-11-14T18:20:19.560 回答