在 ListView 中拖放和重新排序元素

Drag Drop and Reorder elements in ListView

我正在关注 this 库以将拖放功能添加到我的列表视图中。将第一项移到第二位时一切都很好。但是,当我将列表视图的第一个元素移动到第三位时,应用程序崩溃了。为了解释我的情况,我添加了图像。我认为这是在 Swap items 行引起的,但我认为我的代码是正确的。当我尝试将第一项替换为第三项时,应用程序崩溃了。任何帮助对我来说都是有价值的。感谢您的帮助。

这是我的适配器代码。

public class NavigationDrawerListViewAdapter extends BaseAdapter implements Communicator,Swappable{

    private LayoutInflater mInflater;
    public ArrayList<NavigationDrawerFragment.ListItem> myItems;



    public NavigationDrawerListViewAdapter(Context activity, ArrayList<NavigationDrawerFragment.ListItem> listItemElements) {
        mInflater = (LayoutInflater) activity.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        myItems = listItemElements;

    }


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

    @Override
    public NavigationDrawerFragment.ListItem getItem(int position) {
        return myItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return myItems.get(position).hashCode();
    }

    @Override
    public boolean hasStableIds(){
        return true;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View v = convertView;
        final ViewHolder holder;
        final NavigationDrawerFragment.ListItem i = myItems.get(position);
        if (i != null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.navigation_drawer_listview_simple, null);
                holder.text = (TextView) convertView.findViewById(R.id.textView123);
                holder.text.setText(i.textdata);
                convertView.setTag(holder);
                parent.setTag(holder);
                holder.text.setTag(position);


        }
        return convertView;
    }

    @Override
    public void respond(String name) {

    }

    @Override
    public void sendData(String url, String type) {

    }

    @Override
    public void sendMapValues(Geometry featureGeometry, Symbol featureSymbol, Object featureAttrValues) {
            //doinNothing
    }

    @Override
    public void swapItems(int i, int i2) {

        NavigationDrawerFragment.ListItem obj1 = myItems.get(i);
        myItems.remove(i);
        myItems.add(i2,obj1);
        this.notifyDataSetChanged();

    }


    class ViewHolder {
        TextView text;
    }

}

我认为您的代码一直在将第一项添加到第二个位置,但第二项被删除了。这发生在 ArrayList 内部,而不是在 GUI 中。

我建议一种仅交换这两项的技术,使用临时对象进行基本交换。这次温度是 obj1。 使用您的风格的示例代码:

public void swapItems(int i, int i2) {
   NavigationDrawerFragment.ListItem obj1 = myItems.get(i);
   myItems.set(i, myItems.get(i2);
   myItems.set(i2, obj1);
}

注意:我正在使用 ArrayList set 方法而不是 add()。