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