如何使用Realm将数据预加载到RecyclerView [英] How to Show Preload data to RecyclerView using Realm

查看:78
本文介绍了如何使用Realm将数据预加载到RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我将Realm用作本地数据库.我正在使用recyclerview小部件显示这些数据.现在,initiallay我想在回收器视图中显示一些预加载数据,这些数据也将存储在领域中.然后我将实现添加,编辑,删除方法.但是尝试运行该应用程序时出现致命错误.我是Realm的新手.我无法确定这是什么问题.

In my App I am using Realm as local database. I am using recyclerview widget to show these data. Now initiallay I want to show some preload data in recycler view which would be stored in realm as well. then I will implement add, edit, delete method. But I am having fatal error while trying to run this app. I am very new in Realm. I cannot identify which problem is this.

我已经通过应答代码解决了这个问题.这是解决方案.

I have Solved this problem with the help of answer code. here is the solution for this.

已解决的代码

我的活动班级是

public class MyColleaguesPage extends AppCompatActivity {

private RecyclerView recyclerView;
private MyColleaguesAdapter adapter;
private Realm colleagueRealm;
private List<MyColleagueModel> colleagueObject;
private RealmResults<MyColleagueModel> dataResult;
private static final String DIALOG_TAG = "EmployeeDialog";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);

    colleagueRealm = Realm.getDefaultInstance();
    recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler);

    setUpRecycler();

    if (!Prefs.with(this).getPreLoad()) {
        setRealmData();
    }
    showAllPersons();

 }

private void showAllPersons() {
    dataResult = colleagueRealm.where(MyColleagueModel.class).findAll();
    setAdapter(dataResult);
    adapter.notifyDataSetChanged();
 }
//find all objects in the Book.class
private void setAdapter(RealmResults<MyColleagueModel> results) {
    adapter = new MyColleaguesAdapter(this, results);
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

}
private void setUpRecycler() {

    recyclerView.setHasFixedSize(true);
    final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
}

private void setRealmData(){

    List<MyColleagueModel> colleague = new ArrayList<>();
    MyColleagueModel model = new MyColleagueModel();
    model.setId(1 + System.currentTimeMillis());
    model.setName("Name1");
    model.setCompany("Comapny1");
    model.setTitle("Title1");
    colleague.add(model);

    model = new MyColleagueModel();
    model.setId(2 + System.currentTimeMillis());
    model.setName("Name2");
    model.setCompany("Comapny2");
    model.setTitle("Title1");
    colleague.add(model);

    model = new MyColleagueModel();
    model.setId(3 + System.currentTimeMillis());
    model.setName("Name3");
    model.setCompany("Comapny3");
    model.setTitle("Title3");
    colleague.add(model);


    for (MyColleagueModel realmModel : colleague) {
            // Persist the colleague data
            colleagueRealm.beginTransaction();
            colleagueRealm.copyToRealm(realmModel);
            colleagueRealm.commitTransaction();
    }

    Prefs.with(this).setPreLoad(true);

 }

.....

推荐答案

解决紧急问题

private void setRealmData(){
    List<MyColleagueModel> colleague = new ArrayList<>();

    MyColleagueModel model = new MyColleagueModel();
    model.setId(1 + System.currentTimeMillis());
    model.setName("Name1");
    model.setCompany("Comapny1");
    model.setTitle("Title1");
    colleague.add(model);

    model.setId(2 + System.currentTimeMillis());
    model.setName("Name2");
    model.setCompany("Comapny2");
    model.setTitle("Title1");
    colleague.add(model);

    model.setId(3 + System.currentTimeMillis());
    model.setName("Name3");
    model.setCompany("Comapny3");
    model.setTitle("Title3");
    colleague.add(model);

应该是

private void setRealmData(){
    List<MyColleagueModel> colleague = new ArrayList<>();

    MyColleagueModel model = new MyColleagueModel();
    model.setId(1 + System.currentTimeMillis());
    model.setName("Name1");
    model.setCompany("Comapny1");
    model.setTitle("Title1");
    colleague.add(model);

    model = new MyColleagueModel();
    model.setId(2 + System.currentTimeMillis());
    model.setName("Name2");
    model.setCompany("Comapny2");
    model.setTitle("Title1");
    colleague.add(model);

    model = new MyColleagueModel();
    model.setId(3 + System.currentTimeMillis());
    model.setName("Name3");
    model.setCompany("Comapny3");
    model.setTitle("Title3");
    colleague.add(model);


但是基于Prefs.with(this).preload(),您的代码基于Ravi Tamada的教程,该教程充满了糟糕的实践,我认为它仍然是Realm 0.82.2.


But based on Prefs.with(this).preload() you are basing your code on Ravi Tamada's tutorial which is full of terrible practices and I think it's still Realm 0.82.2.

别忘了Realm的最新版本(在撰写本文时)是Realm 3.5.0,最好使用

Don't forget that latest version of Realm (at time of writing) is Realm 3.5.0, and you are better off with the official documentation.

例如,您应该使用 realm-android-adapters (官方插件),而不是使用您自己的插件.

For example, you should use RealmRecyclerViewAdapter provided by realm-android-adapters (official add-on) instead of using your own.

编辑:这是完整的解决方案

Here is full solution

public class MyColleaguesPage extends AppCompatActivity implements ColleagueListListener {

    private Realm realm;
    private RecyclerView recyclerView;
    private MyColleaguesAdapter adapter;

    private static final String DIALOG_TAG = "EmployeeDialog";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mycolleagues_layout);

        // Showing and Enabling clicks on the Home/Up button
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
        realm = Realm.getDefaultInstance();
        recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler);

        recyclerView.setHasFixedSize(true);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new MyColleaguesAdapter(this, realm.where(MyColleagueModel.class).findAllSortedAsync("id"));
        recyclerView.setAdapter(adapter);
     }

     @Override
     protected void onDestroy() {
        super.onDestroy();
        realm.close();
        realm = null;
     }
}        

public class InitialData implements Realm.Transaction {
    @Override
    public void execute(Realm realm) {
        List<MyColleagueModel> colleague = new ArrayList<>();
        MyColleagueModel model = new MyColleagueModel();
        model.setId(1 + System.currentTimeMillis());
        model.setName("Name1");
        model.setCompany("Comapny1");
        model.setTitle("Title1");
        colleague.add(model);

        model = new MyColleagueModel();
        model.setId(2 + System.currentTimeMillis());
        model.setName("Name2");
        model.setCompany("Comapny2");
        model.setTitle("Title1");
        colleague.add(model);

        model = new MyColleagueModel();
        model.setId(3 + System.currentTimeMillis());
        model.setName("Name3");
        model.setCompany("Comapny3");
        model.setTitle("Title3");
        colleague.add(model);


        for (MyColleagueModel realmModel : colleague) {
            realm.insertOrUpdate(realmModel);
        }
    }

    @Override
    public boolean equals(Object obj) {
        return obj != null && obj instanceof InitialData;
    }

    @Override
    public int hashCode() {
        return InitialData.class.hashCode();
    }
}

public class CustomApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
        Realm.setDefaultConfiguration(new RealmConfiguration.Builder()
                      .deleteIfMigrationNeeded()
                      .initialData(new InitialData())
                      .build());
    }
}

<application name=".CustomApplication"
             .../>

public class MyColleaguesAdapter extends RealmRecyclerViewAdapter<MyColleagueModel, MyColleaguesAdapter.ColleagueHolder> {   
    public interface ColleagueListListener {
        void addPerson(MyColleagueModel colleagueModel);
        void editPerson(MyColleagueModel colleagueModel);
    }

    private final ColleagueListListener colleagueListListener;

    public MyColleaguesAdapter(ColleagueListListener colleagueListListener, RealmResults<MyColleagueModel> results) {
        super(results, true);
        this.colleagueListListener = colleagueListListener;
    }

    @Override
    public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ColleagueHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.colleage_row_layout,parent,false));
    }

    @Override
    public void onBindViewHolder(ColleagueHolder holder, int position) {
        final MyColleagueModel myColleague = getData().get(position);
        holder.bind(myColleague);
    }

    public class ColleagueHolder extends RecyclerView.ViewHolder {

        public CardView cardView;
        public ImageView colleaguePicture;
        public TextView  colleagueName;
        public TextView  companyName;
        public TextView  jobTitle;

        public ColleagueHolder(View itemView) {
            super(itemView);
            //colleaguePicture=(ImageView)itemView.findViewById(R.drawable.profile_image);
            colleagueName=(TextView)itemView.findViewById(R.id.colleague_name);
            companyName=(TextView) itemView.findViewById(R.id.company_name);
            jobTitle=(TextView) itemView.findViewById(R.id.job_title);
            cardView=(CardView)itemView.findViewById(R.id.cardview_user);
          }
        }

        public void bind(MyColleagueModel myColleague) {
            holder.colleagueName.setText(myColleague.getName());
            holder.companyName.setText(myColleague.getCompany());
            holder.jobTitle.setText(myColleague.getTitle());
            holder.cardView.setTag(position);
            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    colleagueListListener.editPerson(myColleague);
                }
            });
        }
 }

这篇关于如何使用Realm将数据预加载到RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆