使用自定义适配器时,空RecyclerView [英] Empty RecyclerView when using custom Adapter
问题描述
我想填充我 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 EmptyRecyclerView
. 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 orAsyncTask()
, 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屋!