java - 在可扩展 ListView 中使用 SimpleCursorTreeAdapter 时获取光标值

标签 java android sqlite

我正在将 SimpleCursorTreeAdapter 用于 ExpandableListview。我从 android 示例中得到了示例 效果很好。

我的两个光标投影是这样的

private static final String[] PRIMARY_PROJECTION = new String[] {
        CategoryPrimary.Columns._ID, CategoryPrimary.Columns.VALUE,
        CategoryPrimary.Columns.KEY };

private static final String[] SUBCATEGORY_PROJECTION = new String[] {
        CategorySub.Columns._ID, CategorySub.Columns.VALUE,
        CategorySub.Columns.KEY, CategorySub.Columns.STATUS };

我像这样在我的 SimpleCursorAdapter 中传递这些值。

mAdapter = new MyExpandableListAdapter(
            mActivity,
            R.layout.category_group,
            R.layout.category_items,
            new String[] { CategoryPrimary.Columns.VALUE }, // Name for
                                                            // group layouts
            new int[] { R.id.lblListHeader },
            new String[] { CategorySub.Columns.VALUE }, // Number for child
                                                        // layouts
            new int[] { R.id.lblListItem });

我的问题是,当我单击 edxpandablelistview 的子项时,我还需要 CategoryPrimary.Columns._ID 和 CategorySub.Columns._ID 我可以简单地做的就是在我的布局中放置一个不可见的 TextView

R.layout.category_group,
R.layout.category_items,

并将数据绑定(bind)到其中。但是我不想绑定(bind)我的数据,还有其他方法吗?

我的完整类(class)如下。----------------------

     public class CategoryFragment extends Fragment implements OnGroupClickListener,
    OnGroupExpandListener, OnGroupCollapseListener, OnChildClickListener {

private static final String[] PRIMARY_PROJECTION = new String[] {
        CategoryPrimary.Columns._ID, CategoryPrimary.Columns.VALUE,
        CategoryPrimary.Columns.KEY };
// private static final int GROUP_ID_COLUMN_INDEX = 0;

private static final String[] SUBCATEGORY_PROJECTION = new String[] {
        CategorySub.Columns._ID, CategorySub.Columns.VALUE,
        CategorySub.Columns.KEY, CategorySub.Columns.STATUS };
private static final int TOKEN_GROUP = 0;
private static final int TOKEN_CHILD = 1;
private QueryHandler mQueryHandler;
private CursorTreeAdapter mAdapter;
private ExpandableListView expandableListView;
private SocialEyePlusActivity mActivity;
DealFragment dealFragment;

private static final class QueryHandler extends AsyncQueryHandler {

    private CursorTreeAdapter mAdapter;

    public QueryHandler(Context context, CursorTreeAdapter adapter) {
        super(context.getContentResolver());
        this.mAdapter = adapter;
    }

    @Override
    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
        switch (token) {
        case TOKEN_GROUP:
            mAdapter.setGroupCursor(cursor);
            break;

        case TOKEN_CHILD:
            int groupPosition = (Integer) cookie;
            mAdapter.setChildrenCursor(groupPosition, cursor);
            break;
        }
    }
}

public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {

    public MyExpandableListAdapter(Context context, int groupLayout,
            int childLayout, String[] groupFrom, int[] groupTo,
            String[] childrenFrom, int[] childrenTo) {

        super(context, null, groupLayout, groupFrom, groupTo, childLayout,
                childrenFrom, childrenTo);
    }

    @Override
    protected Cursor getChildrenCursor(Cursor groupCursor) {
        String primaryValue = groupCursor.getString(groupCursor
                .getColumnIndex(CategoryPrimary.Columns.VALUE));
        final String selection = CategorySub.Columns.PRIMARYCATEGORY
                + " ='" + primaryValue + "'";
        mQueryHandler.startQuery(TOKEN_CHILD, groupCursor.getPosition(),
                CategorySub.CONTENT_URI, SUBCATEGORY_PROJECTION, selection,
                null, null);

        return null;
    }

    @Override
    protected void bindGroupView(View view, Context context, Cursor cursor,
            boolean isExpanded) {
        super.bindGroupView(view, context, cursor, isExpanded);
        TextView lblListHeader = (TextView) view
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        if (cursor.getPosition() % 2 != 0) {
            lblListHeader
                    .setBackgroundResource(R.drawable.group_normal_first);

        } else {
            lblListHeader
                    .setBackgroundResource(R.drawable.group_normal_second);
        }
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        TextView txtListChild = (TextView) super.getChildView(
                groupPosition, childPosition, isLastChild, convertView,
                parent);

        if (groupPosition % 2 == 0) {
            if (childPosition == 0) {
                txtListChild
                        .setBackgroundResource(R.drawable.group_child_button_red);
            } else {
                txtListChild
                        .setBackgroundResource(R.drawable.group_childbutton);
            }
        } else {

            if (childPosition == 0) {
                txtListChild
                        .setBackgroundResource(R.drawable.group_child_button_blue);
            } else {
                txtListChild
                        .setBackgroundResource(R.drawable.group_childbutton);
            }
        }
        return txtListChild;
    }

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dealFragment = (DealFragment)getParentFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_category, container,
            false);
    expandableListView = (ExpandableListView) view
            .findViewById(R.id.category_listview);
    expandableListView.setOnGroupClickListener(this);
    expandableListView.setOnGroupExpandListener(this);
    expandableListView.setOnGroupCollapseListener(this);
    expandableListView.setOnChildClickListener(this);

    mAdapter = new MyExpandableListAdapter(
            mActivity,
            R.layout.category_group,
            R.layout.category_items,
            new String[] { CategoryPrimary.Columns.VALUE }, // Name for
                                                            // group layouts
            new int[] { R.id.lblListHeader },
            new String[] { CategorySub.Columns.VALUE }, // Number for child
                                                        // layouts
            new int[] { R.id.lblListItem });
    expandableListView.setDividerHeight(0);
    expandableListView.setAdapter(mAdapter);
    mQueryHandler = new QueryHandler(mActivity, mAdapter);
    mQueryHandler.startQuery(TOKEN_GROUP, null,
            CategoryPrimary.CONTENT_URI, PRIMARY_PROJECTION, null, null,
            null);
    return view;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (mActivity == null) {
        mActivity = (SocialEyePlusActivity) activity;
    }
}

@Override
public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) {
    Log.d("OnCliekd is Clicked", ""+groupPosition);
    Log.d("OnCliekd is Clicked", ""+childPosition);
    DealSubCatgFragment dealsSubListFragment = DealSubCatgFragment.newInstance("1","109");
    dealFragment.containerFragment.replaceFragment(dealsSubListFragment, true, true);

    return false;
}

@Override
public void onGroupCollapse(int arg0) {

}

@Override
public void onGroupExpand(int arg0) {

}

@Override
public boolean onGroupClick(ExpandableListView arg0, View view, int arg2,
        long arg3) {

    return false;
}

}

最佳答案

找到解决方案了。我将键和 id 值设置为 TextView 中的标签`

            @Override
    protected void bindChildView(View view, Context context, Cursor cursor,
            boolean isLastChild) {
        super.bindChildView(view, context, cursor, isLastChild);
        TextView txtListChild = (TextView) view
                .findViewById(R.id.lblListItem);
        txtListChild.setTag(""+cursor.getString(cursor.getColumnIndex(CategorySub.Columns.KEY)));
    }`

并以与子元素相同的方式在 onGroupClicked 回调中获取标签值,并且工作正常

关于java - 在可扩展 ListView 中使用 SimpleCursorTreeAdapter 时获取光标值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19115932/

相关文章:

Samsung Galaxy S4 (SGS4) 上的 Android 套接字问题

sql - 多列选择语句

android - 更新 SQLite 中的前 n 条记录

java - 来自 OSGi 包的相对路径

Java Connect 数据源永无止境

java - Android:如何使用类中 Activity 的用户输入

java - 如何将带分隔符的平面文件解析为 POJO

android - 在 android 上使用 pocketsphinx 未检测到关键字

java - Android Studio 任务“:app:compileDefaultFlavorDebugJavaWithJavac”失败

sqlite - SVN - SQLite - 磁盘 I/O 错误