Java 从工作线程使用RecyclerView.setAdapter
使用memberRecListRecyclerView,我试图水平列出组中的每个成员,但在设置其适配器时遇到了这个问题:Java 从工作线程使用RecyclerView.setAdapter,java,android,firebase,android-recyclerview,android-viewholder,Java,Android,Firebase,Android Recyclerview,Android Viewholder,使用memberRecListRecyclerView,我试图水平列出组中的每个成员,但在设置其适配器时遇到了这个问题: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 注意:我在评论中加入了一些注释,滚动到底部查看它们 以下是RecycleView初始化: // I do Init
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
注意:我在评论中加入了一些注释,滚动到底部查看它们
以下是RecycleView初始化:
// I do InitMemberList() in the OnCreate method of my activity
private void InitMemberList()
{
LinearLayoutManager layoutManager =
new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
memberRecList = (RecyclerView) findViewById(R.id.member_list);
memberRecList.setHasFixedSize(true);
memberRecList.setLayoutManager(layoutManager);
//NOTE 1 (scroll to bottom)
}
我的数据集是ArrayList成员。我使用FirebaseDatabase从工作线程检索它,如下所示:
//this is also in the OnCreate() method, doesn't matter if it's before
//or after InitMembersList() because it starts a separate thread.
//I'm showing it just in case I have any errors here
private void GetMemberInfo(final String userId)
{
//NOTE 2 (scroll to bottom)
//Getting the reference of the database
DatabaseReference ref = userDB.getReference().getRef();
Query query = ref.child(userId);
//Firebase's method names are confusing. These below just retrieve the
//data from the database ONCE.
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
tempMember = dataSnapshot.getValue(User.class); //Getting member info
members.add(tempMember); //adding member info to the list
memberCount --; //number of members left to retrieve
if(memberCount == 0) {
//NOTE 3 (scroll to bottom)
PopulateMemberList(); //the adapter is set inside here
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
我在PopulateMemberList()方法中设置了成员适配器,如下所示:
private void PopulateMemberList()
{
MembersListAdapter adapter = new MembersListAdapter(members);
memberRecList.setAdapter(adapter);
}
这是我的自定义成员自适应程序:
public class MembersListAdapter extends RecyclerView.Adapter<MembersListAdapter.MemberViewHolder> {
private ArrayList<User> users = new ArrayList<>();
public MembersListAdapter(ArrayList<User> users) {
this.users = users;
}
public class MemberViewHolder extends RecyclerView.ViewHolder{
TextView rep_txt;
ImageView memberImageView;
public MemberViewHolder(View itemView) {
super(itemView);
rep_txt = (TextView) itemView.findViewById((R.id.member_rep_text));
memberImageView = (ImageView) itemView.findViewById(R.id.member_profile_image);
}
}
@Override
public int getItemCount() {
return users.size();
}
@Override
public MemberViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//NOTE 4 (scroll to bottom)
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.member_list_item, parent, true);
return new MemberViewHolder(itemView);
}
@Override
public void onBindViewHolder(MemberViewHolder holder, int position) {
final User currentMember = users.get(position);
//changing the text of my textviews
//Loading Member Image
Picasso.with(GroupActivity.this)
.load(currentMember.getProfile_picture_ref())
.into(holder.memberImage);
}
但我得到了以下错误的一百万个实例:
E/AndroidRuntime: at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:6688)
然后出现StackOverflow错误,应用程序崩溃:
D/Error: ERR: exClass=java.lang.StackOverflowError
D/Error: ERR: exMsg=stack size 8MB
D/Error: ERR: file=ViewGroup.java
D/Error: ERR: class=android.view.ViewGroup
D/Error: ERR: method=resetResolvedLayoutDirection line=6687
D/Error: ERR: stack=java.lang.StackOverflowError: stack size 8MB
位于android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:6687)
之后,最后一行重复至少100次,最后:
D/Error: ERR: TOTAL BYTES WRITTEN: 41276
编辑:忘了提及,我知道FirebaseRecyclerAdapter存在,但我无法使用它。如果你知道其他图书馆可以帮助我,请告诉我。此外,我更喜欢使用ListView而不是RecyclerView,但我需要水平列出项目(以便我可以向左/向右滚动),我认为这在ListView中是不可能的。您会得到一个
非法状态异常
,因为:
@Override
public MemberViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//NOTE 4 (scroll to bottom)
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.member_list_item, parent, true);
return new MemberViewHolder(itemView);
}
当你为一个RecyclerView
膨胀视图时,你不应该把它添加到它的父视图中,android会帮你。
将下一行中的标志更改为false
,以不向父视图添加视图:
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.member_list_item, parent, false);
您会得到一个非法状态异常,原因如下:
@Override
public MemberViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//NOTE 4 (scroll to bottom)
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.member_list_item, parent, true);
return new MemberViewHolder(itemView);
}
当你为一个RecyclerView
膨胀视图时,你不应该把它添加到它的父视图中,android会帮你。
将下一行中的标志更改为false
,以不向父视图添加视图:
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.member_list_item, parent, false);
谢谢将其设置为false修复了它!我想这是一个重复的问题,因为我在别人的问题上看到了同样的错误,答案说的是把最后一个参数改为false。我不敢相信我也忘了在代码中更改它。啊,很乐意帮忙。不用担心,这种情况经常发生,主要是因为即使您不指定标志,那么默认值是
true
,您仍然会得到异常。谢谢!将其设置为false修复了它!我想这是一个重复的问题,因为我在别人的问题上看到了同样的错误,答案说的是把最后一个参数改为false。我不敢相信我也忘了在代码中更改它。啊,很乐意帮忙。不要担心,这种情况经常发生,主要是因为即使您没有指定标志,那么默认值是true
,您仍然会得到异常。