私は、フラグメントでリサイクルビューでユーザーのリストを表示する必要があります。コードは結構ですが、私はアプリを実行すると、リストには表示されません。
package com.example.demo;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.demo.Model.User;
import com.mongodb.Block;
import com.mongodb.DBObject;
import com.mongodb.stitch.android.core.Stitch;
import com.mongodb.stitch.android.core.StitchAppClient;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteFindIterable;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoClient;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoCollection;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoCursor;
import org.bson.Document;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class UsersFragment extends Fragment {
private RecyclerView recyclerView;
private UserAdapter userAdapter = null;
private List<User> mUsers = null;
private String username;
private String imageURL;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fargment_users,container,false);
recyclerView = view.findViewById(R.id.recycler_view);
StitchAppClient stitchAppClient = Stitch.getDefaultAppClient();
RemoteMongoClient client = stitchAppClient.getServiceClient(RemoteMongoClient.factory,"mongodb-atlas");
RemoteMongoCollection db = client.getDatabase("db").getCollection("Users");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mUsers = new ArrayList<>();
mUsers.clear();
try {
readUsers();
} catch (InterruptedException e) {
e.printStackTrace();
}
return view;
}
private void readUsers() throws InterruptedException {
StitchAppClient stitchAppClient = Stitch.getDefaultAppClient();
RemoteMongoClient client = stitchAppClient.getServiceClient(RemoteMongoClient.factory, "mongodb-atlas");
RemoteMongoCollection db = client.getDatabase("db").getCollection("Users");
RemoteFindIterable docs = db.find();
docs.forEach(new Block<Document>() {
@Override
public void apply(Document document) {
username = document.getString("username");
imageURL = document.getString("imageURL");
Log.d("rrrrrrrr", "apply: " + username + imageURL);
User user = new User(username, imageURL);
mUsers.add(user);
Log.d("rrrrrrrr", "apply: " + mUsers);
}
});
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
}
それから私は、コードをデバッグしようと、これらの行にブレークポイントを置きます
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
そして、リストが現れました。私は、ブレークポイントを削除し、コードが働いていなかったので、何が起こったのかわかりませんでした。それから私は、ブレークポイントを追加してみました
username = document.getString("username");
そして、私はそれぞれ、すべてのラインを通してそれを実行し、私はそれがそれらのラインは、上記に行くことはありません発見しました。リストには、まだ表示されませんでした。私は入れてみました
Thread.yield();
ライン間が、何も働きました。私もの間、これらのラインを入れてみました
getActivity.runOnUiThread(){new Runnable{...}}
しかし、動作しません。助けてください。ありがとうございました。
MongoDBので働いたが、それはのように思えるしていないdb.find()
リターンの約束のいくつかの並べ替えのコレクションを、そしてあなたのapply(Document doc)
非同期コールバックです。あなたのuserAdapterは常に空の配列で構成されていることを意味します。
非同期コールバックを使用して、アダプターの作図線の「ステップ」ボタンをクリックし、時間によって値を働いて戻ってきたので、しかし、それは、デバッグモードで動作します。
私はプロジェクトに追加し、追加できることがわかったので、そのためのマニュアルを参照して(それも存在しない?)が見つかりませんでしたOnCompleteListener
しRemoteFindIterable
。それは、アダプタを作るための場所でなければなりません。
docs.forEach(new Block<Document>() {
@Override
public void apply(Document document) {
username = document.getString("username");
imageURL = document.getString("imageURL");
User user = new User(username, imageURL);
mUsers.add(user);
}
}).addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
});
また、にアダプタを取り付ける考慮RecyclerView
でonCreateView
はなく、中にonSuccessListener
呼び出すnotifyDataSetChanged()
ことに。