Android 我得到了;IndexOutOfBoundsException“;当我尝试从ListView向下拖动行时(使用DragSortListView)

Android 我得到了;IndexOutOfBoundsException“;当我尝试从ListView向下拖动行时(使用DragSortListView),android,listview,android-asynctask,indexoutofboundsexception,dragsort,Android,Listview,Android Asynctask,Indexoutofboundsexception,Dragsort,我在youtube上看到了一个教程,展示了如何将数据添加到sqlLite db,然后将这些数据显示到一个数据库中 做了那件事之后。。。我已将DragSortListView应用于我的listview。。。但每次我拖一排。此错误不断出现,我无法解决: FATAL EXCEPTION: main Process: com.example.justi.ricksonbar, PID: 29157 java.lang.IndexOutOfBoundsException: Index: 0, Size:

我在youtube上看到了一个教程,展示了如何将数据添加到sqlLite db,然后将这些数据显示到一个数据库中

做了那件事之后。。。我已将DragSortListView应用于我的listview。。。但每次我拖一排。此错误不断出现,我无法解决:

FATAL EXCEPTION: main
Process: com.example.justi.ricksonbar, PID: 29157
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
  at java.util.ArrayList.get(ArrayList.java:411)
  at com.example.justi.ricksonbar.ProductAdapter.getItem(ProductAdapter.java:49)
  at com.example.justi.ricksonbar.BackgroundTask$1.drop(BackgroundTask.java:91)
  at com.mobeta.android.dslv.DragSortListView.dropFloatView(DragSortListView.java:1501)
  at com.mobeta.android.dslv.DragSortListView.access$1200(DragSortListView.java:59)
  at com.mobeta.android.dslv.DragSortListView$DropAnimator.onStop(DragSortListView.java:1293)
  at com.mobeta.android.dslv.DragSortListView$SmoothAnimator.run(DragSortListView.java:1192)
  at android.os.Handler.handleCallback(Handler.java:751)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:154)
  at android.app.ActivityThread.main(ActivityThread.java:6119)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
这是我的ProductAdapter.java

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;

import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ProductAdapter extends ArrayAdapter{
    List list = new ArrayList();


    public ProductAdapter(Context context,int resource) {
        super(context, resource);
    }

    public void add(Product object) {
        list.add(object);
        super.add(object);
    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(int position, final View convertView, ViewGroup parent) {
        View row = convertView;
        final ProductHolder productHolder;
        if(row == null){
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.product_list, parent, false);
            productHolder = new ProductHolder();
            productHolder.tx_name = (TextView)row.findViewById(R.id.tvProd_name);
            productHolder.tx_price = (TextView)row.findViewById(R.id.tvProd_price);
            productHolder.tx_type = (TextView)row.findViewById(R.id.tvProd_type);
            row.setTag(productHolder);
        }else{
            productHolder = (ProductHolder) row.getTag();
        }
        Product product = (Product) getItem(position);
        productHolder.tx_name.setText(product.getName().toString());
        productHolder.tx_price.setText(Double.toString(product.getPrice()));
        productHolder.tx_type.setText(product.getType().toString());

        return row;
    }

    static class ProductHolder{
        TextView tx_name, tx_price, tx_type;
    }

}
以及我的BackgroundTask.java(我在这里放置了DragSortListView方法)

导入android.app.Activity;
导入android.app.voiceinteractior;
导入android.content.Context;
导入android.content.Intent;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.os.AsyncTask;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.mobeta.android.dslv.DragSortController;
导入com.mobeta.android.dslv.DragSortListView;
公共类BackgroundTask扩展了AsyncTask{
上下文ctx;
产品适配器产品适配器;
活动;
DragSortListView listView;
背景任务(上下文ctx){
this.ctx=ctx;
活动=(活动)ctx;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串方法=参数[0];
DatabaseHelper dHelper=新的DatabaseHelper(ctx);
if(方法等于(“添加信息”)){
字符串名称=参数[1];
double price=double.parseDouble(参数[2]);
字符串类型=参数[3];
SQLiteDatabase db=dHelper.getWritableDatabase();
//调用插入法
dHelper.附加信息(数据库、名称、价格、类型);
返回“插入一行…”;
}else if(method.equals(“get_info”)){
listView=(DragSortListView)activity.findViewById(R.id.display\u listView);
SQLiteDatabase db=dHelper.getReadableDatabase();
Cursor Cursor=dHelper.getInformations(db);
productAdapter=新的productAdapter(ctx,R.layout.product\u列表);
字符串名称、类型;
双倍价格;
while(cursor.moveToNext()){
name=cursor.getString(cursor.getColumnIndex(ProductContract.ProductEntry.name));
price=cursor.getDouble(cursor.getColumnIndex(ProductContract.ProductEntry.price));
type=cursor.getString(cursor.getColumnIndex(ProductContract.ProductEntry.type));
产品=新产品(名称、价格、类型);
出版进度(产品);
}
返回“获取信息”;
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(产品…值){
productAdapter.add(值[0]);
}
私有DragSortListView.DropListener onDrop=新建DragSortListView.DropListener()
{
@凌驾
公共作废删除(整数从,整数到)
{
productAdapter=新的productAdapter(ctx,R.layout.product\u列表);
如果(从!=到)
{
对象项=productAdapter.getItem(来自);
产品适配器。移除(项目);
productAdapter.插入(项目,至);
}
}
};
私有DragSortListView.RemoveListener onRemove=新建DragSortListView.RemoveListener()
{
@凌驾
公共无效删除(int-which)
{
productAdapter=新的productAdapter(ctx,R.layout.product\u列表);
移除(productAdapter.getItem(which));
}
};
@凌驾
受保护的void onPostExecute(字符串结果){
if(result.equals(“get_info”)){
setAdapter(productAdapter);
setDropListener(onDrop);
setRemoveListener(onRemove);
DragSortController=新的DragSortController(listView);
controller.setRemoveEnabled(false);
控制器。setSortEnabled(真);
控制器。设置绘图模式(1);
setFloatViewManager(控制器);
setOnTouchListener(控制器);
setDragEnabled(true);
}否则{
Toast.makeText(ctx,result,Toast.LENGTH_LONG).show();
}
}
}

请帮帮我。非常感谢您使用光标适配器,它更高效:


在适配器中添加任何元素之前,您正在尝试获取项

@Override
    public void drop(int from, int to)
    {   // Adapter is Created here
        productAdapter = new ProductAdapter(ctx,R.layout.product_list);
        if (from != to)
        {
            // here you are trying to get item which must throw indexoutofbounds 
            // because you didn't added anything yet
            Object item = productAdapter.getItem(from);
            productAdapter.remove(item);
            productAdapter.insert(item, to);
        }
    }
根据适配器的add方法,将在适配器中添加元素

public void add(Product object) {
    list.add(object);
    super.add(object);
}

可以添加为注释。哦,好的。这是有道理的。现在我在想,我可以把“下降”的方法放在哪里。一定是在数据被添加之后,像这样从适配器中获取项真的不是一个好主意,而是通过适配器您可以传递项的引用。真的吗?我不知道,很明显,你可以看到,我是Android的初学者。我刚刚看到了本教程,并从头开始学习。是的,请深入阅读有关异步任务的内容,然后您将了解在异步任务中使用视图/适配器有多危险。
public void add(Product object) {
    list.add(object);
    super.add(object);
}