gpt4 book ai didi

android - 如何将 "Virtual"/"Shadow"组添加到 SimpleCursorTreeAdapter?

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:58 25 4
gpt4 key购买 nike

我有一个关于我在我的项目中子类化的 SimpleCursorTreeAdapter 的问题。它目前通过 ContentProvider 与 SQLite-DB 通信。现在,我遇到了一个问题,我想插入后端 ContentProvider/DB 中不存在的某种“影子”或“虚拟”组。

我可以想象这可以通过两种方式实现——我只是想不出细节。我们要么找到在内部绘制和列出 SimpleCursorTreeAdapter 组的实际方法,要么我们实现一个行为类似于 SQliteCursor 的自定义 Cursor,除了它返回 ColumnCount+1 并在查询时为该“虚拟”组附加一个“虚拟”元素...

有没有人已经做过类似的事情,或者可能知道如何解决这个不太脏的 hack-y?

最佳答案

... or we implement a custom Cursor that behaves like a SQliteCursor, except that it returns ColumnCount+1 and appends an "virtual" element for that "virtual" group when queried...

或者您在适配器级别实现它,欺骗它认为其所基于的 Cursor 有一个额外的行。我写了一个例子(一个简单的场景)但它需要工作:

public class ExtraGroupAdapter extends SimpleCursorTreeAdapter {

private Cursor mExtraChildCursor;

@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
// if groupCursor.getPosition() returns -1 we have to provide the Cursor for our fake group
}

@Override
public int getGroupCount() {
// 1 more
return super.getGroupCount() + 1;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (groupPosition == 0) {
if (getCursor() == null) {
throw new IllegalStateException(
"this should only be called when the cursor is valid");
}
View v;
if (convertView == null) {
v = newGroupView(mContext, getCursor(), isExpanded, parent);
} else {
v = convertView;
}
// if it's position 0 move the group Cursor to position -1 to
// let the bindGroupView method that is deals with our fake row
getCursor().moveToPosition(-1);
bindGroupView(v, mContext, getCursor(), isExpanded);
return v;
} else {
return super.getGroupView(groupPosition - 1, isExpanded,
convertView, parent);
}
}

@Override
protected void bindGroupView(View view, Context context, Cursor cursor,
boolean isExpanded) {
if (cursor.getPosition() == -1) {
// bind our fake row, unfortunately this must be done manually
} else {
super.bindGroupView(view, context, cursor, isExpanded);
}
}

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if (groupPosition == 0) {
// replicate what the CursorTreeAdapter does for our fake group
// position 0
if (getCursor() == null) {
throw new IllegalStateException(
"this should only be called when the cursor is valid");
}
View v;
getCursor().moveToPosition(-1);
mExtraChildCursor.moveToPosition(childPosition);
if (convertView == null) {
v = newChildView(mContext, mExtraChildCursor, isLastChild,
parent);
} else {
v = convertView;
}
bindChildView(v, mContext, mExtraChildCursor, isLastChild);
return v;
} else {
// use the default implementation but offset the Cursor's
// current position
return super.getChildView(groupPosition - 1, childPosition,
isLastChild, convertView, parent);
}
}

@Override
public int getChildrenCount(int groupPosition) {
if (groupPosition == 0) {
// implement the trick
if (mExtraChildCursor == null) {
getCursor().moveToPosition(-1); // in the getChildrenCursor
// a Cursor position of -1
// means it is the fake row
mExtraChildCursor = getChildrenCursor(getCursor());
return 0;
} else {
return mExtraChildCursor.getCount();
}
}
return super.getChildrenCount(groupPosition);
}

@Override
public void setChildrenCursor(int groupPosition, Cursor childrenCursor) {
if (groupPosition == 0) {
// hold a reference to the extra Cursor
mExtraChildCursor = childrenCursor;
notifyDataSetChanged();
} else {
super.setChildrenCursor(groupPosition, childrenCursor);
}
}

}

我应该扩展 CursorTreeAdapter,因为 SimpleCursorTreeAdapter 是为简单场景设计的。我写的是放置在位置 0 的假行(但经过一些仔细的计算,可以使用不同的位置)。

关于android - 如何将 "Virtual"/"Shadow"组添加到 SimpleCursorTreeAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com