android - 使用简单的光标拖放

标签 android drag-and-drop simplecursoradapter

我正在使用 CommonsGuy 的拖放示例,我基本上是在尝试将它与 Android 记事本示例集成。

Drag N Drop

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

所以我的问题是如何将简单游标适配器的结果放入字符串数组,但在单击列表项时仍然返回行 ID,以便我可以将它传递给编辑笔记的新 Activity 。

这是我的代码:

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);
    }
}

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

最佳答案

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

简单但有些笨拙的解决方案是遍历 Cursor 并从该数据中创建一个 ArrayList,然后使用该 ArrayListArrayAdapterTouchListView

巧妙但复杂的解决方案是创建一个位于 TouchListView 和您的 SimpleCursorAdapter 之间的装饰性 ListAdapter 并且了解您的拖放操作数据更改并即时应用它们。例如,如果用户交换位置 5 和 6,当 TouchListView 调用 getView() 获取位置 5 时,装饰适配器将知道从 SimpleCursorAdapter.

关于android - 使用简单的光标拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047578/

相关文章:

android - BroadcastReceiver 生命周期——静态变量

java - Firebase Google 登录不工作

silverlight - 使用 F# 和异步工作流在 Silverlight 中拖放

c# - 拖放至 Windows 窗体问题

android - 自定义 SimpleCursorAdapter

Android 如何使用简单光标适配器/自定义光标适配器从数据库加载数据并将文本和图像放在一行中

android - 如何将文本从 ListView 项目传递到新的 Activity

android - 如何使用自定义列表适配器显示 listView 为空

java - 每天仅从 Android ListView 中为用户验证一次

Jquery:如何从对象 HTMLDivElement 获取内容?