2015-08-23 38 views
0

我试图做一些对我有一个sqlite数据库中的项目排序方法。起初,我有这个RecyclerView从数据库加载数据。 Rows http://i58.tinypic.com/ibvvr8.jpgsqlite的排序方法

通过拖动手柄,将行拖到所需的位置。我想要做的事情是保存位置,并能够得到它,并重新安排行一模一样的下一次我启动应用程序。

我试图通过类的onItemMove方法检测何时移动一行,并保存交换位置的行的新位置,但位置变得混乱,并且我没有得到期望的结果。也许解决方案是不错,但我的排序方法搞砸了。这就是我的数据传递到适配器之前实现

public static ArrayList<Package> orderPackages(ArrayList<Package> packages) { 
     for(int i = 0; i < packages.size(); i++) { 
      Package p = packages.get(i); 
      int desiredPosition = p.getPosition(); 
      if(desiredPosition != -1) { 
       if(desiredPosition < packages.size()) { 
        Package tempPackage = packages.get(i); 
        packages.remove(i); 
        packages.add(tempPackage.getPosition(), tempPackage); 
       } 
      } 
     } 
     return packages; 
    } 

那么,有没有更好的解决方案,以记住行感动所以位置下一次我启动应用程序的行会被放置在相同的位置在适配器?

回答

0

我有一个类似的列表,你这样做,我完成记忆位置的方法是实现通过整个ArrayList中从适配器连接到活动或片段这样回来的监听器。

首先这里是监听

public interface OnFieldListChangeListener { 
    void onDefaultListChanged(List<String> fields); 
} 

然后在适配器我每次都设置监听器这样

private OnFieldListChangeListener mListener; 

    public void setOnFieldChangeListener(OnFieldListChangeListener listener){ 
     mListener = listener; 
    } 

    public FieldListAdapter(List<String> fields, Context context, OnStartDragListener dragStartListener){ 
     mDefaultFields = fields; 
     mContext = context; 
     mDragStartListener = dragStartListener; 
    } 

将我拖到列表重新安排它,这个片段通知这样

@Override 
    public void onItemMove(int fromPosition, int toPosition) { 
     Collections.swap(mDefaultFields, fromPosition, toPosition); 
     mListener.onDefaultListChanged(mDefaultFields); 
     notifyItemMoved(fromPosition, toPosition); 
    } 

然后在片段的活性,你需要保持名单的副本你传递给适配器,然后实现该接口,并且每个通过拖拽的方式在适配器列表发生变化时,您只需更新这样

​​

名单现在你可以保存此列表中的数据库,并将其将保留新列表的重新排列位置。

希望它有帮助。