我试图通过android应用中的领域来创建愿望清单。我从数据库中获取数据,并使用putExtra将它们从适配器放到SinglePost活动中。现在,我想在** SinglePost Activity **中使用Realm。但是在此代码中
RealmResults<ModelPost> results = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();
领域无法保存任何东西。因为ModelPost.class是在Adapter中定义的,而不是在Single Activity中定义的。如何在活动中使用服务器中的数据定义ModelPost?还是我可以将SinglePost活动中的数据发送到Realm数据库的方式?
适配器
public class Adapter extends RecyclerView.Adapter<Adapter.viewHolder> {
private Context context;
private List<ModelPost> modelPost;
public Adapter(Context context, List<ModelPost> modelPost) {
this.context = context;
this.modelPost = modelPost;
}
@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_post, viewGroup, false);
return new viewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull viewHolder viewHolder, int i) {
ModelPost modelPost = this.modelPost.get(i);
viewHolder.textView.setText(modelPost.getTitle());
viewHolder.cardView.setOnClickListener(v -> {
Intent intent = new Intent(Adapter.this.context, SinglePost.class);
intent.putExtra("ID", modelPost.getID() + "");
intent.putExtra("Title", modelPost.getTitle() + "");
intent.putExtra("Content", modelPost.getContent() + "");
intent.putExtra("Category", modelPost.getCategory() + "");
intent.putExtra("Expert", modelPost.getExpert() + "");
intent.putExtra("Image", modelPost.getImage() + "");
intent.putExtra("URL", modelPost.getURL() + "");
intent.putExtra("Video", modelPost.getVideo() + "");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
});
SinglePost活动
public class SinglePost extends AppCompatActivity {
String id, image, url, content, video;
int idd;
TextView postTitle, postContent, postExpert;
ImageView postImage, bookmark, videoPlay;
Realm realm;
public Adapter adapter;
private List<ModelPost> modelPost;
public static final String Key_Post = "ID";
...
id = getIntent().getStringExtra("ID");
idd = Integer.valueOf(id);
postTitle.setText(getIntent().getStringExtra("Title"));
postExpert.setText(getIntent().getStringExtra("Expert"));
image = getIntent().getStringExtra("Image");
url = getIntent().getStringExtra("URL");
content = (getIntent().getStringExtra("Content"));
video = (getIntent().getStringExtra("Video"));
realm = Realm.getDefaultInstance();
RealmResults<ModelPost> result = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();
if (result.size() != 0) {
bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp);
} else {
bookmark.setImageResource(R.drawable.ic_bookmark_border_black_24dp);
}
Bookmark();
}
private void Bookmark() {
bookmark.setOnClickListener(v -> realm.executeTransaction(realm -> {
RealmResults<ModelPost> results = realm.where(ModelPost.class).equalTo(Key_Post, idd).findAll();
if (results.size() == 0) {
realm.copyToRealm(modelPost);
bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp);
Toast.makeText(getApplicationContext(), "Added to Wishlist", Toast.LENGTH_SHORT).show();
} else {
results.get(0).deleteFromRealm();
bookmark.setImageResource(R.drawable.ic_bookmark_border_black_24dp);
Toast.makeText(getApplicationContext(), "Removed from Wishlist", Toast.LENGTH_SHORT).show();
}
}));
}
ModelPost
package com.example.petraa.Model;
import java.io.Serializable;
import io.realm.RealmObject;
import io.realm.annotations.LinkingObjects;
import io.realm.annotations.PrimaryKey;
public class ModelPost extends RealmObject implements Serializable {
int ID;
private String Title;
private String Image;
private String Content;
private String Category;
private String Expert;
private String URL;
private String Video;
public ModelPost() {
}
public Integer getID() {
return ID;
}
public void setID(Integer ID) {
this.ID = ID;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getImage() {
return Image;
}
public void setImage(String image) {
Image = image;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getCategory() {
return Category;
}
public void setCategory(String category) {
Category = category;
}
public String getExpert() {
return Expert;
}
public void setExpert(String expert) {
Expert = expert;
}
public String getURL() {
return URL;
}
public void setURL(String URL) {
this.URL = URL;
}
public String getVideo() {
return Video;
}
public void setVideo(String video) {
Video = video;
}
}
所以,我的理解是适配器中(基于RealmModel的)List
的ModelPost
将同时包含Realm中的项目和非Realm中的项目,其中“ in realm”等同于“ marked” 。来自适配器的流看起来还不错,它(通过意图)传递了对象的ID(用于从Realm检索)及其所有数据(对于不在Realm中的对象)。
我认为这会使事情变得复杂-您确定要这样做吗?通过跨意图传递整个对象数据,然后您需要在另一侧重新创建对象,以后添加字段也意味着在此处进行额外的维护。如果所有对象都在领域中会更好,但是通过布尔字段表示书签状态。这样,您只需要在活动中更改该标志的状态,就可以在意图中传递ID,因为它可以保证在域中。
即在SinglePost
...]
modelPost = realm.where(ModelPost.class).equalTo(Key_Post, idd).findFirst();
然后
Bookmark()
更改...bookmark.setOnClickListener(v -> realm.executeTransaction(realm -> { modelPost.isBookmarked = !modelPost.isBookmarked; if (modelPost.isBookmarked) { bookmark.setImageResource(R.drawable.ic_bookmark_black_24dp); Toast.makeText(getApplicationContext(), "Added to Wishlist", Toast.LENGTH_SHORT).show(); } else { bookmark.setImageResource(...); Toast.makeText(getApplicationContext(), "Removed from Wishlist", Toast.LENGTH_SHORT).show(); } }));
如果您确实想添加/删除对象,那么您将需要根据传递的数据在活动中创建
modelPost
对象(而非List
)。这可能会让您满意,但对我来说却很难闻,我建议您使用其他选项。顺便说一句,将ID的传递更改为本地使用整数;更改
intent.putExtra("ID", modelPost.getID() + "");
to
intent.putExtra("ID", modelPost.getID());
并在活动侧使用
getIntExtra()
。