【问题标题】:Sqlite ordering methodSqlite 排序方法
【发布时间】:2015-08-23 23:26:37
【问题描述】:

我正在尝试对sqlite 数据库中的项目执行某种排序方法。起初我有这个RecyclerView 从数据库加载数据。

通过拖动手柄,我将行拖动到所需位置。我想做的事情是保存该位置并能够在下次启动应用程序时获取它并重新排列完全相同的行。

我尝试通过RecyclerView.Adapter 类的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;
    }

那么有没有更好的解决方案来记住行移动的位置,以便下次我启动应用程序时,该行将放置在适配器中的同一位置?

【问题讨论】:

    标签: android sqlite android-recyclerview


    【解决方案1】:

    我有一个和你类似的列表,我完成记住位置的方法是实现一个侦听器,像这样将整个 Arraylist 从 Adapter 传递回 Activity 或 Fragment。

    首先是监听器

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

    每次我拖动列表重新排列时,都会像这样通知Fragment

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

    然后在 Fragment 的 Activity 中,您需要保留传递给适配器的 List 的副本,然后实现该接口,并且每次通过拖动的方式在 Adapter 中更改列表时,您只需像这样更新 List这个

      @Override
        public void onDefaultListChanged(List<String> fields) {
            mFields.setFields(fields);
        }
    

    现在您可以将此列表保存回数据库,它将保留列表重新排列的新位置。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多