【问题标题】:RecyclerView gets delayed to show up its itemsRecyclerView 延迟显示其项目
【发布时间】:2016-09-03 13:09:23
【问题描述】:

我正在从数据存储在Firebase 数据库中的对象中填充RecyclerViewRecyclerView 显示当前正在使用该应用程序的用户。 尽管RecyclerView 在显示器关闭并再次打开之前不会显示它们,但所有数据均已正确获取。一旦显示器重新打开,RecyclerView 就会填充其项目。我使用调试来找出问题所在。在调试时它工作得很好。但是在运行应用程序时,问题又回来了。如果有人可以帮助我解决这个问题,我们将不胜感激。 我已经在下面发布了我的代码。

protected void onStart() {
    super.onStart();
    mClient.connect();
    childEventListener = tempUserRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if (dataSnapshot.exists()) {
                UserDetailsClass userDetailsClass = dataSnapshot.getValue(UserDetailsClass.class);

                if (!userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
                    myFriendsAdapter.refillAdapter(userDetailsClass);
                }
                if (userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
                    sender = userDetailsClass.getName();
                }
            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

适配器类

public class MyFriendsAdapter extends RecyclerView.Adapter<MyFriendsAdapter.MyFriendsViewHolder> {

Context context;
ClickListener clickListener;
List<UserDetailsClass> friendsList;

public MyFriendsAdapter(Context context, List<UserDetailsClass> friendsList) {
    this.context = context;
    this.friendsList = friendsList;
}

@Override
public MyFriendsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    MyFriendsViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.friend_online, parent, false);
    viewHolder = new MyFriendsViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(MyFriendsViewHolder holder, int position) {
    TextView name = holder.getName();
    name.setText(friendsList.get(position).getName());
    holder.getStateName().setText(friendsList.get(position).getStateName());
    setOnlineStatus(holder, position);
}

private void setOnlineStatus(MyFriendsViewHolder holder, int position) {
    if (friendsList.get(position).getOnline_offline_status() == 1) {
        holder.getOnline_offline().setText("Online");
        holder.getOnline_offline().setTextColor(Color.GREEN);
    }
}

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

public void refillAdapter(UserDetailsClass userDetailsClass) {
    friendsList.add(userDetailsClass);
}

public void cleanUp() {
    friendsList.clear();
}

public void setClickListener(ClickListener clickListener) {
    this.clickListener = clickListener;
}

class MyFriendsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView name;
    private TextView online_offline;
    private TextView stateName;
    private TextView distance;

    public MyFriendsViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.textView3);
        online_offline = (TextView) itemView.findViewById(R.id.online);
        stateName = (TextView) itemView.findViewById(R.id.textView4);
        distance = (TextView) itemView.findViewById(R.id.textView13);
        itemView.setOnClickListener(this);

    }

    public TextView getName() {
        return name;
    }

    public void setName(TextView name) {
        this.name = name;
    }

    public TextView getOnline_offline() {
        return online_offline;
    }

    public void setOnline_offline(TextView online_offline) {
        this.online_offline = online_offline;
    }

    public TextView getStateName() {
        return stateName;
    }

    public void setStateName(TextView stateName) {
        this.stateName = stateName;
    }

    public TextView getDistance() {
        return distance;
    }

    public void setDistance(TextView distance) {
        this.distance = distance;
    }

    @Override
    public void onClick(View view) {
        if (clickListener != null) {
            String name = friendsList.get(getPosition()).getName();
            clickListener.itemClick(view, getPosition(), name);
            //friendsList.get(getPosition()).getName();
        }
    }

}

public interface ClickListener {

    void itemClick(View view, int position, String name);
}

}

【问题讨论】:

  • 添加后忘记调用 notifydatasetchanged()
  • 听起来像一个答案@ColdFire :-)
  • @FrankvanPuffelen 是的,它是一个
  • @panduka 如果有帮助请接受答案
  • @ColdFire 抱歉回复晚了。它工作得非常好。那是你的巨大帮助。非常感谢。

标签: android firebase android-recyclerview firebase-realtime-database


【解决方案1】:

你可以看到你没有在add方法之后添加notifydatasetchanged(),你需要通知适配器你已经添加了一个项目

【讨论】:

    【解决方案2】:

    你不见了notifyDataSetChanged()

    要么添加到这里:

    if (!userDetailsClass.getUserID().equals(UserDetails.getString("UniqueID", "ID"))) {
        myFriendsAdapter.refillAdapter(userDetailsClass);
        myFriendsAdapter.notifyDataSetChanged();
    }
    

    或这里:

    public void refillAdapter(UserDetailsClass userDetailsClass) {
        friendsList.add(userDetailsClass);
        notifyDataSetChanged();
    }
    
    public void cleanUp() {
        friendsList.clear();
        notifyDataSetChanged();
    }
    

    【讨论】:

      【解决方案3】:

      使用 Firebase 中的数据填充 RecyclerView 中的列表项的最佳方法是使用 FirebaseRecyclerAdapter。查看这些说明以获取更多信息:

      FirebaseUI-database

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-25
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多