在ListView中拖放Drop和Reorder元素

时间:2015-04-22 07:57:33

标签: android-listview drag-and-drop

我跟随this库添加拖放功能我的列表视图。将第一个项目移动到第二个位置时一切都很好。但是当我将listview第一个元素移动到第三位应用程序崩溃时。为了解释我的情况,我添加了图片。我认为它只是在Swap项目行引起的,但我认为我的代码是正确的。当我尝试将第一项替换为第三项时,应用程序崩溃了。任何帮助对我都有价值。谢谢你的帮助。

enter image description here

这是我的适配器代码。

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

}

1 个答案:

答案 0 :(得分:2)

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

我建议使用一种技术来交换这两个项目,使用临时对象进行基本交换。这次temp是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()。