使用自定义适配器时,空RecyclerView [英] Empty RecyclerView when using custom Adapter

查看:189
本文介绍了使用自定义适配器时,空RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想填充我 RecyclerView 从云数据( parse.com )。然而,最终的结果是一个空的 RecyclerView 。虽然我能够检索从云中的数据,我看不到屏幕上的任何。

下面是主要的活动code:

 公共类BigBoard扩展ActionBarActivity {私人列表<&人GT;者;
私人RecyclerView RV;
RVAdapter适配器;
字符串A,B;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    Parse.initialize(这一点,APP-ID,客户端密钥);
    的setContentView(R.layout.activity_big_board);
    适配器=新RVAdapter(人);
    RV =(RecyclerView)findViewById(R.id.rv);    LinearLayoutManager LLM =新LinearLayoutManager(本);
    rv.setLayoutManager(LLM);
    rv.setHasFixedSize(真);    initializeData();
    initializeAdapter();}私人无效initializeData(){
    人=新的ArrayList<>();
    ParseQuery<&的parseObject GT;查询=新ParseQuery<&的parseObject GT;(资格证书);
    query.findInBackground(新FindCallback<&的parseObject GT;(){
        公共无效完成(列表<&的parseObject GT; credentialList,ParseException的E){
            如果(E == NULL){
                的for(int i = 0; I< credentialList.size();我++)
                {
                    A = credentialList.get(I).getString(姓名);
                    B = credentialList.get(I).getString(姓);
                    persons.add(新的Person(A,B));                    Log.d(OUT,所以瓦尔:: ------>中+ A + B);
                    adapter.notifyDataSetChanged();                }
            }其他{
                Log.d(得分,错误:+ e.getMessage());
            }
        }
    });
    //persons.add(new人(艾玛·威尔逊,23岁));
    //persons.add(new人(拉维Maiss,25岁));
    //persons.add(new人(利利瓦,35岁));}私人无效initializeAdapter(){    rv.setAdapter(适配器);
}

和我能登录,我从云收到价值,另外,如果我使用一些pre定义的值code正常工作。正如你所看到的注释行:


  //persons.add(new人(艾玛·威尔逊,23岁));
   //persons.add(new人(拉维Maiss,25岁));
   //persons.add(new人(利利瓦,35岁));


和,这里是code到Adapter类:

 公共类RVAdapter扩展RecyclerView.Adapter< RVAdapter.PersonViewHolder> {公共静态类PersonViewHolder扩展RecyclerView.ViewHolder {    CardView简历;
    TextView的PERSONNAME;
    TextView的人士;
    // ImageView的personPhoto;    PersonViewHolder(查看ItemView控件){
        超(ItemView控件);
        CV =(CardView)itemView.findViewById(R.id.cv);
        PERSONNAME =(TextView中)itemView.findViewById(R.id.person_name);
        人物=(TextView中)itemView.findViewById(R.id.person_age)​​;
        // personPhoto =(ImageView的)itemView.findViewById(R.id.person_photo);
    }
}清单<&人GT;者;RVAdapter(列表<&人GT;人){
    this.persons =者;
}@覆盖
公共无效onAttachedToRecyclerView(RecyclerView recyclerView){
    super.onAttachedToRecyclerView(recyclerView);
}@覆盖
公共PersonViewHolder onCreateViewHolder(ViewGroup中ViewGroup中,int i)以{
    视图V = LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.item,ViewGroup中,假的)。
    PersonViewHolder PVH =新PersonViewHolder(V);
    返回PVH;
}@覆盖
公共无效onBindViewHolder(PersonViewHolder personViewHolder,int i)以{
    personViewHolder.personName.setText(persons.get(I)。名称);
    personViewHolder.personAge.setText(persons.get㈠.surname);
   // personViewHolder.personPhoto.setImageResource(persons.get㈠.photoId);
}@覆盖
公众诠释getItemCount()
{
    如果(人!= NULL)
    {
        返回persons.size();
    }
    其他
    {
        返回0;
    }
}
}

和Person类:

 类Person
{
    字符串名称;
    串姓;
    人(字符串名称,字符串河畔)
    {
        this.name =名称;
        this.surname =河畔;    }
}

虽然我使用了 notifyDataSetChanged()方法,为什么我不能得到任何结果,我应该考虑使用不同的线程或的AsyncTask (),寻找答案,谢谢!


解决方案

但问题是,你实际上并没有设置数据插入适配器。首先添加适配器的内部下面的方法:

 公共无效setPersons(列表<&人GT;人){
        this.persons =者;
        notifyDataSetChanged();
    }

在您的调用类的initializeData()方法,再经过就叫 adapter.setPersons(人)。您不必再次调用如下:

 `私人无效initializeAdapter(){    rv.setAdapter(适配器);
}`

所以基本上只需要调用 adapter.setPersons(人)每当你从服务器获取新的数据。

I am trying to populate my RecyclerView with data from cloud(parse.com). However, The end result is an Empty RecyclerView . Though I am able to retrieve the data from cloud, I don't see any on the Screen.

Here is the main Activity Code:

public class BigBoard extends ActionBarActivity {

private List<Person> persons;
private RecyclerView rv;
RVAdapter adapter;
String a,b;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Parse.initialize(this, "app-id", "client-key");
    setContentView(R.layout.activity_big_board);
    adapter = new RVAdapter(persons);


    rv=(RecyclerView)findViewById(R.id.rv);

    LinearLayoutManager llm = new LinearLayoutManager(this);
    rv.setLayoutManager(llm);
    rv.setHasFixedSize(true);

    initializeData();
    initializeAdapter();

}

private void initializeData(){
    persons = new ArrayList<>();


    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Credentials");
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> credentialList, ParseException e) {
            if (e == null) {
                for(int i=0;i<credentialList.size();i++)
                {
                    a=credentialList.get(i).getString("Name");
                    b=credentialList.get(i).getString("SurName");
                    persons.add(new Person(a,b));



                    Log.d("OUT", "So the Val::------> " +a +b);
                    adapter.notifyDataSetChanged();

                }
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });
    //persons.add(new Person("Emma Wilson", "23 years old"));
    //persons.add(new Person("Lavery Maiss", "25 years old"));
    //persons.add(new Person("Lillie Watts", "35 years old"));

}

private void initializeAdapter(){

    rv.setAdapter(adapter);
}

And I am able to log the Values that I receive from Cloud, also, the code works fine if I using some pre-defined values. As you can see the commented lines:

   //persons.add(new Person("Emma Wilson", "23 years old"));
   //persons.add(new Person("Lavery Maiss", "25 years old"));
   //persons.add(new Person("Lillie Watts", "35 years old"));

And, here is the code to the Adapter class:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {

public static class PersonViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    TextView personName;
    TextView personAge;
    //ImageView personPhoto;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        personName = (TextView)itemView.findViewById(R.id.person_name);
        personAge = (TextView)itemView.findViewById(R.id.person_age);
        //personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
    }
}

List<Person> persons;

RVAdapter(List<Person> persons){
    this.persons = persons;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.personName.setText(persons.get(i).name);
    personViewHolder.personAge.setText(persons.get(i).surname);
   // personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}

@Override
public int getItemCount()
{
    if(persons!=null)
    {
        return persons.size();
    }
    else
    {
        return 0;
    }
}
}

And the Person class :

    class Person
{
    String name;
    String surname;


    Person(String name, String sur)
    {
        this.name = name;
        this.surname = sur;

    }
}

Though I use an notifyDataSetChanged() method, why am I not able to get any result, should I consider using a different thread or AsyncTask() , looking for Answers, Thanks !

解决方案

The problem is, you are not actually setting the data into the adapter. First off add the following method inside of your adapter :

public void setPersons(List<Person> persons){
        this.persons = persons;
        notifyDataSetChanged();
    }

Then after the initializeData() method in your calling class just call adapter.setPersons(persons). You don't have to call the following again:

`private void initializeAdapter(){

    rv.setAdapter(adapter);
}`

So basically just call adapter.setPersons(persons) whenever you get new data from the server.

这篇关于使用自定义适配器时,空RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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