[英]Enqueue method in Retrofit doesn't load data in Fragment
在過去的 3 天里,我感到震驚,無法使用 retrofit 2.4.0 在 Fragment 中加載 recyclerview 的數據。我可以在終端中看到正在使用實際 url 從服務器獲取數據,但無法填充它(意思是 OnReponse並且在調試代碼時跳過 OnFailure)。此外,我可以在應用程序 UI 上看到一些垃圾值。 在這方面已經回答了一些問題,但沒有一個解決方案對我有用。即使我研究了 github 但在那里沒有找到任何解決方案。 到目前為止,我有以下代碼。
public interface UserAPIEndPoint {
@GET("posts")
Call<List<Post>> getAllUsers();
}
以下是 Retrofit 實例
public class RetrofitInstance {
public static Retrofit retrofit;
private static final String base_Url = "https://jsonplaceholder.typicode.com/";
public static Retrofit getRetrofitInstance(){
if (retrofit == null){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
retrofit = new Retrofit.Builder()
.baseUrl(base_Url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
這是片段 class
public class MessageFragment extends Fragment {
private RecyclerView recyclerView;
private List<Post> user;
private PostAdapter userAdapter;
private LinearLayoutManager layoutManager;
View rootView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_message,container,false);
loadJSON();
return rootView;
}
private void loadJSON() {
try {
UserAPIEndPoint userAPIEndPoint= RetrofitInstance.getRetrofitInstance().create(UserAPIEndPoint.class);
Call<List<Post>> userlist = userAPIEndPoint.getAllUsers();
// userlist.execute();
userlist.enqueue(new Callback<List<Post>>() {
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
user = response.body();
recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
userAdapter = new PostAdapter(getActivity(),user);
recyclerView.setAdapter(userAdapter);
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t) {
}
});
} catch (Exception e) {
Log.d("Error", e.getMessage());
Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
Post.class 通過 pojo2schema 進行轉換。 RecyclerAdapter 如下。
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {
private List<Post> posts;
private Context mcontext;
public PostAdapter(Context context,List<Post> post){
this.posts = post;
this.mcontext =context;
}
@NonNull
@Override
public PostAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout_post,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.userid.setText(String.valueOf(posts.get(position).getUserId()));
holder.id.setText(String.valueOf(posts.get(position).getId()));
holder.title.setText(posts.get(position).getTitle());
holder.body.setText(posts.get(position).getBody());
}
@Override
public int getItemCount() {
return posts.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView userid,id,title,body;
public ViewHolder(View itemView) {
super(itemView);
userid = (TextView) itemView.findViewById(R.id.userId);
id = (TextView) itemView.findViewById(R.id.id);
title = (TextView) itemView.findViewById(R.id.title);
body = (TextView) itemView.findViewById(R.id.body);
}
}
}
build.gradle(模塊:應用程序)
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.scratchnavigation"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "androidx.core:core:1.4.0-alpha01"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha04'
implementation 'com.google.firebase:firebase-core:16.0.3'
implementation 'com.google.firebase:firebase-auth:16.0.3'
implementation 'com.miguelcatalan:materialsearchview:1.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
testImplementation 'junit:junit:4.13'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation "androidx.cardview:cardview:1.0.0"
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation "androidx.drawerlayout:drawerlayout:1.0.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'
implementation 'com.squareup.okhttp3:okhttp:4.7.2'
implementation 'org.conscrypt:conscrypt-android:2.4.0'
}
非常感謝這方面的任何幫助。 提前致謝。
我相信這是因為它是一個異步網絡調用。 您在不同的線程中創建所有內容。
有兩種方法可以解決這個問題。
1.)嘗試創建一個處理程序來發布數據集已更改的主線程,例如
Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.post(new Runnable() {
@Override
public void run() {
userAdapter = new PostAdapter(user);
recyclerView.setAdapter(userAdapter);
if (userAdapter != null) {
userAdapter.notifyDataSetChanged(userAdapter);
recyclerView.setVerticalScrollbarPosition(userAdapter.getItemCount());
}
recyclerView.smoothScrollToPosition(userAdapter.getItemCount());
}
});
}
2.)在 onCreateView 分配 recyclerView 和 Adapter 所以它看起來像:
public class MessageFragment extends Fragment {
private RecyclerView recyclerView;
private List<Post> user;
private PostAdapter userAdapter;
private LinearLayoutManager layoutManager;
View rootView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_message,container,false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
userAdapter = new PostAdapter(getActivity(), null);
recyclerView.setAdapter(userAdapter);
loadJSON();
return rootView;
}
private void loadJSON() {
try {
UserAPIEndPoint userAPIEndPoint= RetrofitInstance.getRetrofitInstance().create(UserAPIEndPoint.class);
Call<List<Post>> userlist = userAPIEndPoint.getAllUsers();
userlist.enqueue(new Callback<List<Post>>() {
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
user = response.body();
userAdapter.setData(user);
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t) {
}
});
} catch (Exception e) {
Log.d("Error", e.getMessage());
Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
然后您還可以為該方法修改 PostsAdapter
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {
private List<Post> posts;
private Context mcontext;
public PostAdapter(Context context,List<Post> post){
this.posts = post;
this.mcontext =context;
}
@NonNull
@Override
public PostAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout_post,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.userid.setText(String.valueOf(posts.get(position).getUserId()));
holder.id.setText(String.valueOf(posts.get(position).getId()));
holder.title.setText(posts.get(position).getTitle());
holder.body.setText(posts.get(position).getBody());
}
@Override
public int getItemCount() {
return posts.size();
}
public void setData(@NonNull List<Posts> list){
if(list.size() > 0) {
posts = list;
}
this.noftifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView userid,id,title,body;
public ViewHolder(View itemView) {
super(itemView);
userid = (TextView) itemView.findViewById(R.id.userId);
id = (TextView) itemView.findViewById(R.id.id);
title = (TextView) itemView.findViewById(R.id.title);
body = (TextView) itemView.findViewById(R.id.body);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.