java - 使用自定义适配器时清空 RecyclerView

标签 java android android-recyclerview

我正在尝试使用来自云 (parse.com) 的数据填充我的 RecyclerView。然而,最终结果是一个空的 RecyclerView 。虽然我能够从云端检索数据,但我在屏幕上看不到任何数据。

这是主要 Activity 代码:

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);
}

我可以记录从云接收的值,而且,如果我使用一些预定义的值,代码也可以正常工作。正如您所看到的注释行:

   //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"));

并且,这是 Adapter 类的代码:

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;
    }
}
}

以及 Person 类:

    class Person
{
    String name;
    String surname;


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

    }
}

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

最佳答案

问题是,您实际上并未将数据设置到适配器中。首先在适配器中添加以下方法:

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

然后在调用类中的initializeData()方法之后,只需调用adapter.setPersons(persons)。您不必再次调用以下内容:

`private void initializeAdapter(){

    rv.setAdapter(adapter);
}`

所以基本上只要从服务器获取新数据就调用 adapter.setPersons(persons) 即可。

关于java - 使用自定义适配器时清空 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33358236/

相关文章:

java - 最新的Android开发者设置指南?

java - IndexOutOfBoundsException: charAt: 0 >= length 0 在某些版本的 Android 上

android - 无法解析 : com. android.support :cardview-v7:26. 0.0 android

java - 两个 Eclipse UI Form 部分捕获多余的垂直空间并正确折叠?

java - 如何防止对 System.exit() 的调用终止 JVM?

android - 使用 android :debuggable ="false" 调试 Ionic 应用程序

android - Recyclerview水平扑克牌效果

java - 向上或向下滚动时,recyclerview 无法正常工作

java - 运行具有外部依赖项的 Scala 脚本

java - Java 中的 move/复制文件操作