Android领域数据库未更新记录

Android领域数据库未更新记录,android,android-recyclerview,realm,Android,Android Recyclerview,Realm,我是Android开发新手,我正在尝试在Recyclerview中对项目位置进行排序,我正在使用领域数据库,适配器的数据集是RealmResults 这是我的适配器请查看我的moveItemDown和updateItemPosition方法我试图在updateItemPosition方法中更新项目位置,但它不起作用。我还将我的视图附加到适配器下面 public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapte

我是Android开发新手,我正在尝试在
Recyclerview
中对项目位置进行排序,我正在使用领域数据库,适配器的数据集是
RealmResults

这是我的
适配器
请查看我的
moveItemDown
updateItemPosition
方法我试图在updateItemPosition方法中更新项目位置,但它不起作用。我还将我的视图附加到适配器下面

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private RealmResults<ShoppingList> dataList;
    private Realm mRealm;
    private LayoutInflater mInflater;

    public RecyclerAdapter(Context context, RealmResults<ShoppingList> data, Realm reamDatabaseInstence){
        this.dataList = data;
        this.mInflater = LayoutInflater.from(context);
        mRealm = reamDatabaseInstence;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i("Recycler", "onCreateViewHolder");

        View view = mInflater.inflate(R.layout.shopping_list_item, parent,false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Log.i("Recycler", "onBindViewHolder " + position);

        ShoppingList currentItem = dataList.get(position);
        holder.setData(currentItem, position);
        holder.setListener();
    }

    public void moveItemDown(int position){
        if( position == (dataList.size()-1) ) { return; }
        int oi = position;
        int ni = position+1;
        updateItemPosition(oi, ni);
        notifyDataSetChanged();

    }

    public void moveItemUp(int position){
        // Need to implement after down sort work
    }

    private void updateItemPosition(final int pos, final int new_pos){
        mRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                ShoppingList old_item = realm.where(ShoppingList.class)
                        .equalTo("position", pos)
                        .findFirst();
                old_item.setPosition(new_pos);
                Log.d("UpdateData: ",old_item.getTitle()+" "+old_item.getPosition());

                ShoppingList new_item = realm.where(ShoppingList.class)
                        .equalTo("position", new_pos)
                        .findFirst();
                new_item.setPosition(pos);
                Log.d("UpdateData: ",new_item.getTitle()+" "+new_item.getPosition());

            }
        });
    }

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView title;
        ImageButton up, down;
        ImageView image;
        int position;
        ShoppingList current;

        MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.shopping_card_view_title);
            image = (ImageView) itemView.findViewById(R.id.shopping_card_view_image);
            up = (ImageButton) itemView.findViewById(R.id.shopping_card_view_up_btn);
            down = (ImageButton) itemView.findViewById(R.id.shopping_card_view_down_btn);
        }

        void setData(ShoppingList i, int position) {
            title.setText( i.getTitle() );
            image.setImageResource(i.getImageId());
            this.position = position;
            this.current = i;
        }

        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.shopping_card_view_up_btn:
                    moveItemUp(position);
                    break;
                case R.id.shopping_card_view_down_btn:
                    moveItemDown(position);
                    break;
            }
        }

        void setListener() {
            up.setOnClickListener(MyViewHolder.this);
            down.setOnClickListener(MyViewHolder.this);
        }
    }

}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{ 私有RealmResults数据列表; 私人领域; 私人停车场; 公共RecyclerAdapter(上下文上下文、RealmResults数据、Realm reamDatabaseInstence){ this.dataList=数据; this.mInflater=LayoutInflater.from(上下文); mRealm=reamDatabaseInstence; } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ Log.i(“回收商”、“onCreateViewHolder”); 视图=mInflater.flate(R.layout.shopping\u list\u项目,父项,false); MyViewHolder=新的MyViewHolder(视图); 报税表持有人; } @凌驾 public int getItemCount(){ 返回dataList.size(); } @凌驾 公共无效onBindViewHolder(MyViewHolder,int位置){ Log.i(“回收商”、“onBindViewHolder”+位置); ShoppingList currentItem=dataList.get(位置); holder.setData(当前项目、位置); holder.setListener(); } 公共无效moveItemDown(内部位置){ if(position==(dataList.size()-1)){return;} int oi=位置; int ni=位置+1; 更新位置(oi,ni); notifyDataSetChanged(); } 公共无效moveItemUp(内部位置){ //需要在下一步工作后实施 } 私有无效更新位置(最终整数位置、最终整数新位置){ mRealm.executeTransactionAsync(新领域.事务(){ @凌驾 公共void执行(领域){ ShoppingList old_item=realm.where(ShoppingList.class) .equalTo(“位置”,位置) .findFirst(); 旧项目设置位置(新位置); Log.d(“UpdateData:”,old_item.getTitle()+“”+old_item.getPosition()); ShoppingList new_item=realm.where(ShoppingList.class) .equalTo(“职位”,新职位) .findFirst(); 新项目设置位置(pos); Log.d(“UpdateData:”,new_item.getTitle()+“”+new_item.getPosition()); } }); } 类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 文本视图标题; 图像按钮向上,向下; 图像视图图像; 内部位置; 当前购物清单; MyViewHolder(查看项目视图){ 超级(项目视图); title=(TextView)itemView.findViewById(R.id.shopping\u card\u view\u title); image=(ImageView)itemView.findViewById(R.id.shopping\u card\u view\u image); 向上=(ImageButton)itemView.findViewById(R.id.shopping\u card\u view\u up\u btn); down=(ImageButton)itemView.findViewById(R.id.shopping\u card\u view\u down\u btn); } 无效设置数据(购物清单i,内部位置){ title.setText(i.getTitle()); setImageResource(i.getImageId()); 这个位置=位置; 该电流=i; } @凌驾 公共void onClick(视图){ 开关(view.getId()){ 案例R.id.购物卡\U视图\U up\U btn: 向上移动(位置); 打破 案例R.id.购物卡\u视图\u向下\u btn: 向下移动(位置); 打破 } } void setListener(){ setOnClickListener(MyViewHolder.this); setOnClickListener(MyViewHolder.this); } } }

我认为您的购物清单项目对所有人都有唯一的id。只需将id字段设为主要字段,并使用RealMinserToUpdate功能即可。你不必检查任何其他东西。如果id可用,它将更新数据库,如果id不可用,它将只插入。

要获得自动更新,您应该使用


公共类RecyclerAdapter扩展了RealmRecycleServiceAdapter{/它的延迟回复将对您有所帮助,这是两者的结合回答
EpicPandaForce
给出了一个很好的例子来使用
RealmRecycleServiceAdapter
并使您的RecycleView自动化

第二选项
这是使用
唯一ID字段
对列表项进行更改

下面是代码中出现的问题
基本上,当你根据物品的位置获取物品时,例如
position=1;
,然后你更新到位置2,对吗?注意,现在你有两个物品具有相同的
position=2
,现在当你尝试使用
position=2
域获取第一个物品时,返回从位置1更新到位置2的相同物品,现在发生了什么u将日期位置更新回
位置=1

taman neupane
给了你一个好主意,但他描述得不多

请试试这个

private void updateItemPosition(final int pos, final int new_pos){

    final String current_item_id = dataList.get(pos).get_id();
    final String new_item_id = dataList.get(new_pos).get_id();

    mRealm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            // Try to find the result with unique id replace this .equalTo("Your Unique ID Field name", current_item_id)
            ShoppingList old_item = realm.where(ShoppingList.class).equalTo("position", pos).findFirst();

            old_item.setPosition(new_pos);
            // Also here Try to find the result with unique id replace this .equalTo("Your Unique ID Field name", new_item_id)
            ShoppingList new_item = realm.where(ShoppingList.class).equalTo("position", new_pos).findFirst();

            new_item.setPosition(pos);
            //new you can tell you adapter about the changes in dataset.
            notifyItemMoved(pos, new_pos);
            notifyItemRangeChanged(pos, dataList.getSize());
        }
    });
}
然后用它更新你的两个函数

public void moveItemDown(int position){
    if( position == (dataList.size()-1) ) { return; }
    int oi = position;
    int ni = position+1;
    updateItemPosition(oi, ni);
}

public void moveItemUp(int position){
    if( position == 0 ) { return; }
    int oi = position;
    int ni = position-1;
    updateItemPosition(ni, oi);
}
就这样。 如果有人想修改我的解释,我将不胜感激,因为我的英语不好。


愉快的编码。

嗨,谢谢你的解释让我试试你的解决方案。完美:)非常感谢你的解释和代码。它现在可以工作了,
public void moveItemDown(int position){
    if( position == (dataList.size()-1) ) { return; }
    int oi = position;
    int ni = position+1;
    updateItemPosition(oi, ni);
}

public void moveItemUp(int position){
    if( position == 0 ) { return; }
    int oi = position;
    int ni = position-1;
    updateItemPosition(ni, oi);
}