简体   繁体   English

在recyclerView中没有显示项目

[英]No showing items in recyclerView

I have a method where I post request to server and if database is empty , I add items to database,if there are some items in database , just render them in adapter. 我有一种方法可以将请求发布到服务器,如果数据库为空则将项目添加到数据库中,如果数据库中有一些项目,只需在适配器中呈现它们即可。

 private void getContacts() {
        database = SugarRecord.listAll(ContactORM.class);

        if(database.isEmpty()) {
            showProgressDialog();
            FactoryAPI.getContacts().getContacts(user.getToken()).enqueue(new Callback<ContactsResponse>() {
                @Override
                public void onResponse(Call<ContactsResponse> call, Response<ContactsResponse> response) {
                    if (response.isSuccessful()) {
                        contactList = response.body().getContactsList();
                        if (database.isEmpty()) {
                            for (int i = 0; i < contactList.size(); i++) {
                                ContactORM contact = new ContactORM();
                                contact.setId(contactList.get(i).getId());
                                contact.setName(contactList.get(i).getName());
                                contact.setLastname(contactList.get(i).getLastname());
                                contact.setEmail(contactList.get(i).getEmail());
                                contact.setPhoto(contactList.get(i).getPhoto());
                                contact.save();
                                database.add(contact);
                            }
                        }
                        progressDialog.dismiss();
                        setRecyclerView();
                    }
                }

                @Override
                public void onFailure(Call<ContactsResponse> call, Throwable t) {
                    Toast.makeText(getContext(), "failure", Toast.LENGTH_SHORT).show();
                }
            });
        }
        //set recycler view
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mAdapter = new ContactsAdapter(getContext(), database);
        recyclerView.setAdapter(mAdapter);

    }

setRecyclerView method: setRecyclerView方法:

database = SugarRecord.listAll(ContactORM.class); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
mAdapter = new ContactsAdapter(getContext(), database); recyclerView.setAdapter(mAdapter);

Adapter: 适配器:

class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> {

    List<ContactORM> database;
    Context mContext;

    public ContactsAdapter(Context context, List<ContactORM> contacts) {
        this.mContext = context;
        this.database = contacts;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
        return new ViewHolder(view);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.avatar) CircleImageView avatar;
        @BindView(R.id.name) TextView name;

        public ViewHolder(View rowView) {
            super(rowView);
            ButterKnife.bind(this, rowView);
        }
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        ContactORM contact = database.get(position);
        if ((contact.getLastname() != null)) {
            holder.name.setText(contact.getName() + " " + contact.getLastname());
        } else {
            holder.name.setText(contact.getName());
        }
        //if photo is not null, load image
        if (!(contact.getPhoto() == null)) {
            Picasso.with(mContext).load(contact.getPhoto()).resize(100, 100).into(holder.avatar);
        }
    }

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

If I add items to database, items will shown - it is OK, but if database is not empty, it shows nothing how can i show that items in my adapter ? 如果将项目添加到数据库,则将显示项目-可以,但是如果数据库不为空,则什么也没有显示,如何显示适配器中的项目?

You should update the adapter after you have the data. 拥有数据后,您应该更新适配器。 Now you have an asynch event and you set the recycleview before that gets finishes. 现在,您有了一个异步事件,并在完成之前设置了recycleview。

Try this... 尝试这个...

.....
// initialize database here
private ContactsAdapter mAdapter;
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialize recycler view
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setAdapter(mAdapter);

    // database is must not be null here; if null initialize it.
    mAdapter = new ContactsAdapter(getContext(), database);
    getContacts();
}

private void getContacts() {
    database = SugarRecord.listAll(ContactORM.class);

    if(database.isEmpty()) {
        showProgressDialog();
        FactoryAPI.getContacts().getContacts(user.getToken()).enqueue(new Callback<ContactsResponse>() {
            @Override
            public void onResponse(Call<ContactsResponse> call, Response<ContactsResponse> response) {
                if (response.isSuccessful()) {
                    contactList = response.body().getContactsList();
                    if (database.isEmpty()) {
                        for (int i = 0; i < contactList.size(); i++) {
                            ContactORM contact = new ContactORM();
                            contact.setId(contactList.get(i).getId());
                            contact.setName(contactList.get(i).getName());
                            contact.setLastname(contactList.get(i).getLastname());
                            contact.setEmail(contactList.get(i).getEmail());
                            contact.setPhoto(contactList.get(i).getPhoto());
                            contact.save();
                            database.add(contact);
                        }
                    }
                    progressDialog.dismiss();
                    mAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFailure(Call<ContactsResponse> call, Throwable t) {
                Toast.makeText(getContext(), "failure", Toast.LENGTH_SHORT).show();
            }
        });
    }else {
        mAdapter.notifyDataSetChanged();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM