- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Cloud Firestore 数据库填充 Android 应用中的 RecyclerView。我通过在 fragment 的 onAttach 方法中使用任务来获取数据。我需要能够使用 Cloud Firestore 中的数据更新 UI、RecyclerView。
我在 Fragment 的 onAttach 方法中使用虚拟数据填充了 RecyclerView,并且该方法有效,但是当我将在从云中提取数据的任务中使用的 OnCompleteListener 的 onComplete 方法中插入虚拟数据的相同循环时Firestore,RecyclerView 不会更新并且列表保持空白。我需要在那里执行此操作以最终从 Cloud Firestore 插入数据。
在 fragment 内。从 Firestore 数据库返回的数据是正确的,并且我在 Logcat 的 onComplete 方法中看到了所有 Log 语句。
聊天列表 fragment :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
if (mColumnCount <= 1) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
}
chatRecyclerViewAdapter = new ChatRecyclerViewAdapter(ChatList.ITEMS, mListener);
recyclerView.setAdapter(chatRecyclerViewAdapter);
}
return view;
}
...
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnListFragmentInteractionListener) {
mListener = (OnListFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnListFragmentInteractionListener");
}
Log.d(LOG_TAG, "activity attached, creating Firestore instance");
FirebaseFirestore db = FirebaseFirestore.getInstance();
//Worked, but doesn't in OnCompleteListener
/*for (int i = 1; i <= 10; i++) {
ChatList.addItem(ChatList.createDummyItem(i));
}*/
Task<QuerySnapshot> task = db.collection("chats").get();
task.addOnCompleteListener(getActivity(), new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(LOG_TAG, "ID = " + document.getId() + " => " + document.getData());
ChatListMessage chatListMessage = document.toObject(ChatListMessage.class);
for (int i = 1; i <= 10; i++) {
Log.d(LOG_TAG, "adding message");
ChatList.addItem(ChatList.createDummyItem(i));
}
Log.d(LOG_TAG, "ChatListMessage members " + chatListMessage.getLastMessage());
}
} else {
Log.w(LOG_TAG, "Error getting documents.", task.getException());
}
}
});
}
在 ChatList 类中
public static void addItem(ChatListItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.userId, item);
}
public static ChatListItem createDummyItem(int position) {
return new ChatListItem(String.valueOf(position), R.drawable.profile_circle, makeDetails(position),
new Timestamp(System.currentTimeMillis()));
}
public static class ChatListItem {
public final String userId;
public final int pictureUrl;
public final String lastMessage;
public final Timestamp timeStamp;
public ChatListItem(String userId, int pictureUrl, String details, Timestamp timeStamp) {
this.userId = userId;
this.pictureUrl = pictureUrl;
this.lastMessage = details;
this.timeStamp = timeStamp;
}
@Override
public String toString() {
return userId;
}
public Timestamp getTimeStamp() {
return timeStamp;
}
public String getTLastMessage() {
return lastMessage;
}
}
自定义RecyclerViewAdapter
public class ChatRecyclerViewAdapter extends RecyclerView.Adapter<ChatRecyclerViewAdapter.ViewHolder> {
private final List<ChatListItem> mValues;
private final OnListFragmentInteractionListener mListener;
public ChatRecyclerViewAdapter(List<ChatListItem> items, OnListFragmentInteractionListener listener) {
mValues = items;
mListener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_chat, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mItem = mValues.get(position);
holder.contactImageView.setImageResource(mValues.get(position).pictureUrl);
holder.contactImageView.setScaleType(ImageView.ScaleType.FIT_XY);
holder.mContentView.setText(mValues.get(position).lastMessage);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != mListener) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mListener.onListFragmentInteraction(holder.mItem);
}
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final ImageView contactImageView;
public final TextView messageMembersTextView;
public final TextView mContentView;
public final TextView timestampView;
public ChatListItem mItem;
public ViewHolder(View view) {
super(view);
mView = view;
messageMembersTextView = view.findViewById(R.id.message_members);
contactImageView = view.findViewById(R.id.contact_imageView);
mContentView = view.findViewById(R.id.content_textView);
timestampView = view.findViewById(R.id.timestamp_textView);
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
}
如何使用 OnCompleteListener 的 onComplete 方法更新 UI?
最佳答案
为此,需要在OnCompleteListener的onComplete方法中调用chatRecyclerViewAdapter.notifyDataSetChanged()。我忘记在监听器之外执行此操作,因为看起来列表项是在调用 onAttach 方法后被拉入的。
关于java - 更改任务的 OnCompleteListener 的 onComplete 方法中的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54166491/
查看Java库中的代码块AsyncHttpClient ,客户端启动一个新线程(Future)来发出请求。回调是在同一个线程上发生,还是在“主”线程上运行(在本例中,是调用 new AsyncHttp
我的 Controller对象使用 Renci.SshNet 通过 SSH 调用 MySQL 数据库,因为我连接到多个数据库,所以我转向多线程,函数 af.FetchAll()返回 DataSet ,
据我们所知,我们有 onComplete和 onAbort可选回调作为 router.push 中的第二个和第三个参数方法。 router.push(location, onComplete?, on
我正在尝试为 Android 制作一个应用程序。 该应用程序必须有一个登录和注册表单,我不明白为什么方法 onComplete 不起作用,但数据被添加到注册页面的数据库中。 这是代码: private
我想获取使用 windows azure 完成的查询的结果。 private boolean checkIfExist(Client c) { this.clientTable.where()
在 RxJava2 中,这是我的代码: public void myMethod() { Flowable.create(e->{ // do sth. }, BackpressureStrate
我在我的父类中发布了一个 MediaPlayer 成员变量,在我启动它之后,它永远不会调用 onCompletion,或者至少 onCompletionListener 永远不会捕获它?我的代码看起来
通过使用 RxSwift,我的项目的目的是每当用户在搜索栏中键入一个城市时,它都会调用以包装当前温度。目前,我有 viewModel 其中包含 var searchingTerm = Variable
所以,我在 MVC 4 应用程序中使用 FineUploader 3.3,这是一个非常酷的插件,非常值得象征性的成本。现在,我只需要让它正常工作。 我对 MVC 很陌生,对传回 JSON 完全陌生,所
我正在尝试通过 jwplayer().getPlaylistItem().file; 获取视频的 URL onComplete 回调,但它什么也没返回。 jwplayer().onComplete(f
我有一个 Future[Future[Set[String]]。我将其平面化以返回 Future[Set[String]]。我等待无穷大(我知道这很糟糕)然后检查 Future 是否完成。它返回真。但
我正在使用以下源代码通过 jwpalyer 显示视频文件。 jwplayer('mediaplayer').setup({ 'id': 'mediaplayer', 'width'
我在 View 模型中有这个主题: private PublishSubject articleSubject; public Observable newArticleSubject() {
由于某种原因,它只是没有运行 onComplete 函数。然而它确实加载了 fancybox div。我的html: #1 click here
我想在单击提交按钮时调用 JavaScript 函数。我使用了 form_tag ,但该函数没有被触发。我想要如下所示的内容: 'start_form_request(); ' ,:onComple
我想在表单加载后调用 onclick 事件。我没有找到 onCompletion 事件或任何类似的事件 类似于:kind: someUI, onComplete:“Init” 最佳答案 根据您的描述,
有人可以指出在哪里可以找到带有 onComplete 回调的命令模式的实现吗?例如可以在串行宏命令中使用该回调? 最佳答案 试试这个 abstract class Command { fina
函数体是否传递给 Future.onComplete(),它们的闭包是否在调用后被丢弃并因此被垃圾收集? 我问是因为我正在编写无限序列的 Future 实例。每个 Future 都有一个 .onCom
我编写的以下方法运行良好,位于我的 Utils 包中,我从我的一些 Activity 中调用它。 private static Date date = null; public static Date
我正在使用 spring-mvc 和 jquery uploadify 上传图像,我的 uploadify 脚本将图像保存在我的服务器上,我的图像正在保存,但 uploadify 抛出 HTTP 错误
我是一名优秀的程序员,十分优秀!