簡體   English   中英

Retrofit 中的 Enqueue 方法不會在 Fragment 中加載數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM