Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不带库的拖放ListView_Android_Listview_Android Listview_Drag And Drop - Fatal编程技术网

Android 不带库的拖放ListView

Android 不带库的拖放ListView,android,listview,android-listview,drag-and-drop,Android,Listview,Android Listview,Drag And Drop,我有一个显示一些数据的列表视图。现在我想在这个listView中加入拖放项的功能。我的意思是我想把物品从一级拖到三级,依此类推 我得到了一些拖放列表视图的示例,但它们都引用了一个外部库。我只需要使用官方的sdk,我知道从android 3.0开始就可以使用拖放功能 我试着自己建造它,但它对我不起作用。。。大多数具有此功能的教程(android 3.0中的拖放)都是关于拖放视图的,而不是列表中的项目 编辑:我不想要这个库,因为android上有一个拖放视图的功能,我想把它用于项目。在列表中的平均位

我有一个显示一些数据的列表视图。现在我想在这个listView中加入拖放项的功能。我的意思是我想把物品从一级拖到三级,依此类推

我得到了一些拖放列表视图的示例,但它们都引用了一个外部库。我只需要使用官方的sdk,我知道从android 3.0开始就可以使用拖放功能

我试着自己建造它,但它对我不起作用。。。大多数具有此功能的教程(android 3.0中的拖放)都是关于拖放视图的,而不是列表中的项目

编辑:我不想要这个库,因为android上有一个拖放视图的功能,我想把它用于项目。在列表中的平均位置。 这是我的密码:

MainActivity.java:

public class MainActivity extends ListActivity {
private ListView lvSort = null;
private ArrayAdapter<String> sortAdapter = null;
private View layoutDropArea = null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] sortCategories = {"time", "service", "equipment", "type", "alert", "system", "priority"};
    sortAdapter = new ArrayAdapter<String>(this, R.layout.list_item,R.id.textView1,
            sortCategories);
    setListAdapter(sortAdapter);

    lvSort = getListView();
    lvSort.setTextFilterEnabled(true);

    layoutDropArea = findViewById(R.id.dropTarget);

    setupDragDrop();
}

/**
 * Setup what to do when we drag list items
 */
public void setupDragDrop() {
    lvSort.setOnItemLongClickListener(new OnItemLongClickListener() {
        public boolean onItemLongClick(AdapterView<?> arg0, View v,
                int position, long arg3) {
            TextView txtview = (TextView)v.findViewById(R.id.textView1);
            String value = txtview.toString();
            ClipData data = ClipData.newPlainText("procedure", value);
            v.startDrag(data, new DragShadowBuilder(v), null, 0);//!!
            return true;
        }
    });
    DragListener mDragListener = new DragListener();
    // mListView.setOnDragListener(mDragListener);

    layoutDropArea.setOnDragListener(mDragListener);

}
private boolean processDrop(DragEvent event, int newPosition) {
    ClipData data = event.getClipData();
    if (data != null) {
        if (data.getItemCount() > 0) {
            Item item = data.getItemAt(0);
            String value = item.toString();
            updateViewsAfterDropComplete(value, newPosition);
            return true;
        }
    }
    return false;
}

private void updateViewsAfterDropComplete(String listItem, int index) {
    Log.d("InsertItem", "Position: " + index);
    sortAdapter.insert(listItem, index);
    sortAdapter.notifyDataSetChanged();
}

private boolean processDragStarted(DragEvent event) {
    ClipDescription clipDesc = event.getClipDescription();
    if (clipDesc != null) {
        return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
    }
    return false;
}
protected class DragListener implements OnDragListener {

    public boolean onDrag(View v, DragEvent event) {
        final int action = event.getAction();
        switch (action) {
        case DragEvent.ACTION_DRAG_ENTERED:
            // v.setBackgroundColor(Color.GRAY);
            return false;

        case DragEvent.ACTION_DRAG_EXITED:
            // v.setBackgroundColor(Color.TRANSPARENT);
            return true;

        case DragEvent.ACTION_DRAG_STARTED:
            return true;

        case DragEvent.ACTION_DRAG_LOCATION:
            // v.setVisibility(View.VISIBLE);
            //return false;
             return processDragStarted(event);
        case DragEvent.ACTION_DROP:
            v.setBackgroundColor(Color.TRANSPARENT);
            int newPosition = lvSort.pointToPosition(
                    (int) (event.getX()), (int) event.getY());
            Log.d("Position", Integer.toString(newPosition));
            if (newPosition != ListView.INVALID_POSITION)
                return processDrop(event, newPosition);
            else
                return false;
        default:
            return true;

        }
    }

}
}
public类MainActivity扩展了ListActivity{
私有ListView lvSort=null;
private ArrayAdapter sortAdapter=null;
私有视图layoutDropArea=null;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[]sortCategories={“时间”、“服务”、“设备”、“类型”、“警报”、“系统”、“优先级”};
sortAdapter=new ArrayAdapter(此,R.layout.list_项,R.id.textView1,
分类法);
setListAdapter(sortAdapter);
lvSort=getListView();
lvSort.setTextFilterEnabled(true);
layoutDropArea=findViewById(R.id.dropTarget);
setupDragDrop();
}
/**
*设置拖动列表项时要执行的操作
*/
公共无效设置DragDrop(){
lvSort.setOnItemLongClickListener(新的OnItemLongClickListener(){
长单击(AdapterView arg0,视图v,
整数位置,长arg3){
TextView txtview=(TextView)v.findViewById(R.id.textView1);
字符串值=txtview.toString();
ClipData data=ClipData.newPlainText(“过程”,值);
v、 startDrag(数据,新的DragShadowBuilder(v),null,0);/!!
返回true;
}
});
DragListener mDragListener=新的DragListener();
//mListView.setOnDragListener(mDragListener);
layoutDropArea.setOnDragListener(mDragListener);
}
私有布尔processDrop(DrageEvent事件,int newPosition){
ClipData data=event.getClipData();
如果(数据!=null){
if(data.getItemCount()>0){
Item=data.getItemAt(0);
字符串值=item.toString();
updateViewsAfterDropComplete(值,newPosition);
返回true;
}
}
返回false;
}
私有void updateViewsAfterDropComplete(字符串列表项,int索引){
Log.d(“插入项”,“位置:+索引”);
插入(列表项,索引);
sortAdapter.notifyDataSetChanged();
}
私有布尔进程DragStarted(DragEvent事件){
clipddescription clipDesc=event.getclipddescription();
if(clipDesc!=null){
返回clipDesc.hasMimeType(clipddescription.MIMETYPE\u TEXT\u PLAIN);
}
返回false;
}
受保护类DragListener实现OnDragListener{
公共布尔onDrag(视图v,DrageEvent事件){
final int action=event.getAction();
开关(动作){
案例DrageEvent.ACTION\u DRAG\u输入:
//v.背景颜色(颜色为灰色);
返回false;
案例DrageEvent.ACTION\u DRAG\u退出:
//v.背景色(透明色);
返回true;
案例DrageEvent.ACTION\u DRAG\u已启动:
返回true;
case DragEvent.ACTION\u拖动位置:
//v.setVisibility(视图可见);
//返回false;
返回processDragStarted(事件);
案例DrageEvent.ACTION_DROP:
v、 setBackgroundColor(颜色:透明);
int newPosition=lvSort.pointToPosition(
(int)(event.getX(),(int)event.getY());
Log.d(“位置”,Integer.toString(newPosition));
if(newPosition!=列表视图。位置无效)
返回processDrop(事件,newPosition);
其他的
返回false;
违约:
返回true;
}
}
}
}
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dropTarget"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
 android:layout_weight="1">
<ListView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@android:id/list" >
</ListView>
</LinearLayout>

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

</LinearLayout>

通常,我可以在列表视图中拖动项目并将其放到想要的位置,但我有一个问题,当我长时间单击某个项目时,会出现以下异常:com.example.dragdrop.MainActivity.updateViewsAfterDropComplete(MainActivity.java:77)上的java.lang.UnsupportedOperationException

这一行对应于以下内容:“sortAdapter.insert(listItem,index);”

请帮我提供一些线索


感谢和问候

您始终可以创建自定义视图。然后按你想要的方式拖放它们。在您的问题中,您似乎根本不想使用外部库。因此,尝试创建您在自定义视图中调用的类似“级别2”或“级别3”的
东西,然后实现它。另外,试着发布一些您以前使用过的代码,这可能有助于我们判断您的实际情况是否存在问题。

适配器获取阵列并修复它。数组在java中是不可变的,因此在插入过程中存在UnportedOperationException

当我使用一个列表时,异常被解决了,但是在拖放事件中有很多错误。我看到谷歌在2013年8月制作了一个关于拖放列表的教程。他们不使用自己的框架。。。我认为这不适合列入名单。如果有人感兴趣,我会发布链接: