Listview按拖放Android排序

时间:2012-02-05 16:16:06

标签: android listview drag-and-drop

使用拖放操作编辑列表视图后,我在保存列表时遇到问题。

我正在使用此处的源代码:Android Drag and Drop List

代码工作正常,但退出并再次打开应用程序时,新的列表顺序不会保存:

第一个列表视图就像这样

a 
b 
c 
拖放后

c
b
a

但是如果我退出这个应用程序,然后稍后启动它,它仍将是 - > a b c

public class DragNDropListActivity extends ListActivity {

public static String[] mNewPositions; 

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.dragndroplistview);

    ArrayList<String> content = new ArrayList<String>(mListContent.length);
    for (int i=0; i < mListContent.length; i++) {
        content.add(mListContent[i]);
    }

    setListAdapter(new DragNDropAdapter(this, new int[]{R.layout.dragitem}, new int[]{R.id.TextView01}, content));//new DragNDropAdapter(this,content)
    ListView listView = getListView();

    if (listView instanceof DragNDropListView) {
        ((DragNDropListView) listView).setDropListener(mDropListener);
        ((DragNDropListView) listView).setRemoveListener(mRemoveListener);
        ((DragNDropListView) listView).setDragListener(mDragListener);
        ((DragNDropListView) listView).setPositionListener(mPositionListener);
    }
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    String selection = (String) getListAdapter().getItem(position);
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
     SharedPreferences.Editor editor = preferences.edit();
     editor.putString("selection", selection);
     editor.commit();
         Intent i = new Intent(this, DkNewsActivity.class);
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         this.startActivity(i);

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

@Override
   public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
           case (R.id.Info):
              Intent intent = new Intent(Intent.ACTION_VIEW);
              intent.setData(Uri.parse("market://search?q=pub:notToSee"));
              startActivity(intent);

                 break;
           case (R.id.Rate):

           SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putInt("rateDone", 1);
            editor.commit();

               intent = new Intent(Intent.ACTION_VIEW);
              intent.setData(Uri.parse("market://details?id=notToSee"));
              startActivity(intent);
                 break;
       }
       return true;
   }
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

    //set menu rate visible
    if (preferences.getInt("rateDone", 0) == 0){
        menu.getItem(1).setVisible(true);
    }
    else {
        menu.getItem(1).setVisible(false);
    }

    return true;
}

private PositionListener mPositionListener=new PositionListener(){
     public void tryToScrollInAndroid_1point5(int position) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            getListView().setSelection(position);  //android 1.5
        }
     }
};
private DropListener mDropListener = 
    new DropListener() {
    public void onDrop(int from, int to) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            ((DragNDropAdapter)adapter).onDrop(from, to);
            getListView().invalidateViews();

            //Saving dragNDropList
            mNewPositions = new String[adapter.getCount()]; //Initialize your new items storage

            for(int i=0; i < adapter.getCount(); i++) {
                //Implement here your logic for save positions
                mNewPositions[i] = adapter.getItem(i).toString();
            }               
        }
    }
};

private RemoveListener mRemoveListener =
    new RemoveListener() {
    public void onRemove(int which) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            ((DragNDropAdapter)adapter).onRemove(which);
            getListView().invalidateViews();
        }
    }
};

private DragListener mDragListener =
    new DragListener() {

    int backgroundColor = 0xe0103010;
    int defaultBackgroundColor;

        public void onDrag(int x, int y, ListView listView) {}

        public void onStartDrag(View itemView) {
            if (itemView != null){itemView.setVisibility(View.INVISIBLE);
            defaultBackgroundColor = itemView.getDrawingCacheBackgroundColor();
            itemView.setBackgroundColor(backgroundColor);
            ImageView iv = (ImageView)itemView.findViewById(R.id.ImageView01);
            if (iv != null) iv.setVisibility(View.INVISIBLE);
            }
        }

        public void onStopDrag(View itemView) {
            if (itemView != null){itemView.setVisibility(View.VISIBLE);
            itemView.setBackgroundColor(defaultBackgroundColor);
            ImageView iv = (ImageView)itemView.findViewById(R.id.ImageView01);
            if (iv != null) iv.setVisibility(View.VISIBLE);}
        }

};

  private static String[] mListContent={
     "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7","Item 8", "Item 9", "Item 10"
    ,"Item 11", "Item 12", "Item 13", "Item 14", "Item 15", "Item 16", "Item 17","Item 18", "Item 19", "Item 20"};
}

我相信我必须在“私人DropListener mDropListener”下做一些事情来保存更改,我需要读取onCreate上的新项目位置?

2 个答案:

答案 0 :(得分:0)

为什么不在Activity的onPause()方法中使用编辑器将String []放入SharedPreferences(如果不存在则创建一个),然后在onCreate()方法中获取它。这样您将始终拥有最新版本。现在你每次都将它设置为mListContent,这是静态的并且不会改变。这是默认的,而是从共享首选项中获取最后一个。我假设你的新订单是mNewPositions。

答案 1 :(得分:0)

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.dragndroplistview);

    ArrayList<String> content = new ArrayList<String>(mListContent.length);
    for (int i = 0; i < mListContent.length; i++) {
        content.add(mListContent[i]);
    }

    setListAdapter(new DragNDropAdapter(this, new int[]{R.layout.dragitem}, new int[]{R.id.TextView01}, content));//new DragNDropAdapter(this,content)
    ListView listView = getListView();

    if (listView instanceof DragNDropListView) {
        ((DragNDropListView) listView).setDropListener(mDropListener);
        ((DragNDropListView) listView).setRemoveListener(mRemoveListener);
        ((DragNDropListView) listView).setDragListener(mDragListener);
        ((DragNDropListView) listView).setPositionListener(mPositionListener);
    }
}

private PositionListener mPositionListener = new PositionListener() {

    public void tryToScrollInAndroid_1point5(int position) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            getListView().setSelection(position);  //android 1.5
        }
    }
};

private DropListener mDropListener = new DropListener() {

    public void onDrop(int from, int to) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            ((DragNDropAdapter) adapter).onDrop(from, to);
            getListView().invalidateViews();
        }
    }
};

private RemoveListener mRemoveListener = new RemoveListener() {

    public void onRemove(int which) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            ((DragNDropAdapter) adapter).onRemove(which);
            getListView().invalidateViews();
        }
    }
};

private DragListener mDragListener = new DragListener() {

    int backgroundColor = 0xe0103010;
    int defaultBackgroundColor;

    public void onDrag(int x, int y, ListView listView) {
    }

    public void onStartDrag(View itemView) {
        if (itemView != null) {
            itemView.setVisibility(View.INVISIBLE);
            defaultBackgroundColor = itemView.getDrawingCacheBackgroundColor();
            itemView.setBackgroundColor(backgroundColor);
            ImageView iv = (ImageView) itemView.findViewById(R.id.ImageView01);
            if (iv != null) iv.setVisibility(View.INVISIBLE);
        }
    }

    public void onStopDrag(View itemView) {
        if (itemView != null) {
            itemView.setVisibility(View.VISIBLE);
            itemView.setBackgroundColor(defaultBackgroundColor);
            ImageView iv = (ImageView) itemView.findViewById(R.id.ImageView01);
            if (iv != null) iv.setVisibility(View.VISIBLE);
        }
    }
};

private static String[] mListContent = {
        "Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10"
        , "Item 11", "Item 12", "Item 13", "Item 14", "Item 15", "Item 16", "Item 17", "Item 18", "Item 19", "Item 20"};
相关问题