Android 使用简单光标拖放

Android 使用简单光标拖放,android,drag-and-drop,simplecursoradapter,Android,Drag And Drop,Simplecursoradapter,我使用的是CommonsGuy的drag n drop示例,我基本上尝试将其与Android记事本示例集成 在我看到的两个不同的拖放示例中,它们都使用了一个静态字符串数组,当我从数据库获取列表时,使用了简单的游标适配器 因此,我的问题是如何将简单游标适配器的结果放入字符串数组中,但仍让它在单击列表项时返回行id,以便我可以将其传递给编辑注释的新活动 这是我的密码: Cursor notesCursor = mDbHelper.fetchAllNotes(); startManaging

我使用的是CommonsGuy的drag n drop示例,我基本上尝试将其与Android记事本示例集成

在我看到的两个不同的拖放示例中,它们都使用了一个静态字符串数组,当我从数据库获取列表时,使用了简单的游标适配器

因此,我的问题是如何将简单游标适配器的结果放入字符串数组中,但仍让它在单击列表项时返回行id,以便我可以将其传递给编辑注释的新活动

这是我的密码:

Cursor notesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(notesCursor);

    // Create an array to specify the fields we want to display in the list (only NAME)
    String[] from = new String[]{WeightsDatabase.KEY_NAME};

    // and an array of the fields we want to bind those fields to (in this case just text1)
    int[] to = new int[]{R.id.weightrows};

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter notes = 
            new SimpleCursorAdapter(this, R.layout.weights_row, notesCursor, from, to);
    setListAdapter(notes);
这是我正在尝试的代码

public class TouchListViewDemo extends ListActivity {
private static String[] items={"lorem", "ipsum", "dolor", "sit", "amet",
                                                                "consectetuer", "adipiscing", "elit", "morbi", "vel",
                                                                "ligula", "vitae", "arcu", "aliquet", "mollis",
                                                                "etiam", "vel", "erat", "placerat", "ante",
                                                                "porttitor", "sodales", "pellentesque", "augue", "purus"};
private IconicAdapter adapter=null;
private ArrayList<String> array=new ArrayList<String>(Arrays.asList(items));

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    adapter=new IconicAdapter();
    setListAdapter(adapter);

    TouchListView tlv=(TouchListView)getListView();

    tlv.setDropListener(onDrop);
    tlv.setRemoveListener(onRemove);
}

private TouchListView.DropListener onDrop=new TouchListView.DropListener() {
    @Override
    public void drop(int from, int to) {
            String item=adapter.getItem(from);

            adapter.remove(item);
            adapter.insert(item, to);
    }
};

private TouchListView.RemoveListener onRemove=new TouchListView.RemoveListener() {
    @Override
    public void remove(int which) {
            adapter.remove(adapter.getItem(which));
    }
};

class IconicAdapter extends ArrayAdapter<String> {
    IconicAdapter() {
        super(TouchListViewDemo.this, R.layout.row2, array);
    }

    public View getView(int position, View convertView,
                                            ViewGroup parent) {
        View row=convertView;

        if (row==null) {                                                    
            LayoutInflater inflater=getLayoutInflater();

            row=inflater.inflate(R.layout.row2, parent, false);
        }

        TextView label=(TextView)row.findViewById(R.id.label);

        label.setText(array.get(position));

        return(row);
    }
}
公共类TouchListViewDemo扩展ListActivity{
私有静态字符串[]项={“lorem”、“ipsum”、“dolor”、“sit”、“amet”,
“奉献者”、“献祭者”、“精英”、“摩比”、“等级”,
“ligula”、“vitae”、“arcu”、“aliquet”、“mollis”,
“etiam”、“vel”、“erat”、“Placelat”、“ante”,
“波尔蒂托”、“苏打水”、“佩伦茨克”、“奥古斯”、“普卢斯”};
专用IconicAdapter=null;
私有ArrayList数组=新的ArrayList(Arrays.asList(items));
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.main);
适配器=新的图标适配器();
setListAdapter(适配器);
TouchListView tlv=(TouchListView)getListView();
tlv.setDropListener(onDrop);
tlv.setRemoveListener(onRemove);
}
私有TouchListView.DropListener onDrop=新建TouchListView.DropListener(){
@凌驾
公共作废删除(整数从,整数到){
String item=adapter.getItem(来自);
适配器。移除(项目);
适配器。插入(项目,至);
}
};
private TouchListView.RemovelListener onRemove=新建TouchListView.RemovelListener(){
@凌驾
公共无效删除(int-which){
移除(adapter.getItem(which));
}
};
类IconicAdapter扩展了ArrayAdapter{
象似适配器(){
super(TouchListViewDemo.this、R.layout.row2、array);
}
公共视图getView(int位置,视图转换视图,
视图组(父级){
视图行=转换视图;
如果(行==null){
LayoutInflater充气机=getLayoutInflater();
行=充气机。充气(R.layout.row2,父级,false);
}
TextView标签=(TextView)row.findViewById(R.id.label);
label.setText(array.get(position));
返回(行);
}
}
}

我知道我要求的很多,但是在正确的方向上提出一点会有很大帮助!
谢谢

您不能将
SimpleCursorAdapter
TouchListView
一起使用,原因很简单,
SimpleCursorAdapter
无法修改。
适配器必须更改其数据以反映拖放操作

简单但有点笨拙的解决方案是迭代
光标
,并从该数据中创建一个
ArrayList
,然后将该
ArrayList
ArrayAdapter
触摸列表视图一起使用


巧妙但复杂的解决方案是创建一个装饰性的
ListAdapter
,它位于
TouchListView
SimpleCursorAdapter
之间,了解拖放数据更改并动态应用它们。例如,如果用户交换位置5和6,当
TouchListView
调用
getView()
以获得位置5时,装饰适配器将知道从
SimpleCursorAdapter
获取位置6的行,谢谢!就是我想回应的那个人;)是的,我担心这不是一个简单的解决办法。仔细研究之后,似乎需要一个定制适配器。谢谢你给我指明了正确的方向。我想我现在有了一个办法。如果我得到一个有效的解决方案,我会更新这个帖子。@Cameron:“谢谢!正是我想回答的人;)”——好吧,你很幸运,因为我碰巧看到了这个问题。正如
TouchListView
的主页所指出的,支持它的是
cw android
Google组——如果你在那里提问,我很可能会看到它们。@cameron你实现了吗?我目前正在设计我的方法,并试图了解CursorAdapter->ListAdapter->TouchListView之间的联系,以及如何实现有效的解决方案。更新:到目前为止,我所做的是创建一个包含原始名称的字符串数组,将其交叉引用到drag n drop数组以找出哪些位置已更改,然后使用这些更改更新rowId数组。很难看,但很管用。现在,我将尝试对其进行优化,以提高运行效率。