java - 如何使用 Retrofit + Moshi 创建 Recycler View

标签 java android retrofit retrofit2 moshi

我正在尝试将回收器 View 添加到 json 响应中。

我能够成功打印通过 Toast 中的响应获得的数据,但我不确定如何将其传递到 RecyclerView 适配器。他们大多数谈论的是 Gson Converter,而没有谈论 Moshi

我在网上搜索了一段时间,但我很无奈。

我想知道如何将数据从 myactivity(OrderHistoryActivity) 传递到 RecyclerViewAdapter(OrderHistoryRecyclerAdapter)。

这是我的代码

订单历史 Activity

package com.tesmachino.saycure;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.tesmachino.saycure.Auth.TokenManager;
import com.tesmachino.saycure.entities.OrderHistory.OrderHistoryGet;
import com.tesmachino.saycure.entities.OrderHistory.OrderHistoryResponse;
import com.tesmachino.saycure.network.ApiService;
import com.tesmachino.saycure.network.RetrofitBuilder;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class OrderHistoryActivity extends AppCompatActivity {

    ApiService service;
    TokenManager tokenManager;

    Call<OrderHistoryResponse> call;
    private static final String TAG = "OrderHistoryActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_history);

        tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE));
        service = RetrofitBuilder.createServiceWithAuth(ApiService.class, tokenManager);
    }


    @Override
    protected void onResume() {

        call = service.orderHistory();

        call.enqueue(new Callback<OrderHistoryResponse>() {
            @Override
            public void onResponse(Call<OrderHistoryResponse> call, Response<OrderHistoryResponse> response) {
                Toast.makeText(OrderHistoryActivity.this, "" + response.body().getData(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onFailure(Call<OrderHistoryResponse> call, Throwable t) {
                Log.w(TAG, "onFailure: " + t.getMessage());
                Toast.makeText(OrderHistoryActivity.this, "Please Try again after some time", Toast.LENGTH_SHORT).show();

            }
        });

        super.onResume();
    }
}

OrderHistoryRecyclerAdapter

package com.tesmachino.saycure;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.tesmachino.saycure.entities.OrderHistory.OrderHistoryResponse;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;


public class OrderHistoryRecyclerAdapter extends RecyclerView.Adapter<OrderHistoryRecyclerAdapter.ViewHolder> {


    @NonNull
    @Override
    public OrderHistoryRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_order_history, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull OrderHistoryRecyclerAdapter.ViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {

        return 0;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView order_id;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            order_id = (TextView) itemView.findViewById(R.id.order_id);

        }
    }
}

订单历史响应

package com.tesmachino.saycure.entities.OrderHistory;

import com.squareup.moshi.Json;

import org.apache.commons.lang3.builder.ToStringBuilder;

import java.util.List;

public class OrderHistoryResponse {
    @Json(name = "data")
    private List<OrderHistoryGet> data = null;

    public List<OrderHistoryGet> getData() {
        return data;
    }

    public void setData(List<OrderHistoryGet> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("data", data).toString();
    }


}

订单历史获取

package com.tesmachino.saycure.entities.OrderHistory;

import com.squareup.moshi.Json;

import org.apache.commons.lang3.builder.ToStringBuilder;

import java.util.List;

public class OrderHistoryGet {

    @Json(name = "id")
    private Integer id;
    @Json(name = "payment_callback_id")
    private Integer paymentCallbackId;
    @Json(name = "payment_orderid")
    private Integer paymentOrderid;
    @Json(name = "customer_id")
    private Integer customerId;
    @Json(name = "service_type_id")
    private Integer serviceTypeId;
    @Json(name = "number_of_cameras")
    private Integer numberOfCameras;
    @Json(name = "camera_type")
    private Integer cameraType;
    @Json(name = "dvr_channel")
    private Integer dvrChannel;
    @Json(name = "paid_amount")
    private Integer paidAmount;
    @Json(name = "is_paid")
    private Integer isPaid;
    @Json(name = "status")
    private Integer status;
    @Json(name = "deleted_at")
    private Object deletedAt;
    @Json(name = "created_at")
    private String createdAt;
    @Json(name = "updated_at")
    private String updatedAt;
    @Json(name = "service_assign_status")
    private List<OrderHistoryServiceAssign> serviceAssignStatus = null;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getPaymentCallbackId() {
        return paymentCallbackId;
    }

    public void setPaymentCallbackId(Integer paymentCallbackId) {
        this.paymentCallbackId = paymentCallbackId;
    }

    public Integer getPaymentOrderid() {
        return paymentOrderid;
    }

    public void setPaymentOrderid(Integer paymentOrderid) {
        this.paymentOrderid = paymentOrderid;
    }

    public Integer getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Integer customerId) {
        this.customerId = customerId;
    }

    public Integer getServiceTypeId() {
        return serviceTypeId;
    }

    public void setServiceTypeId(Integer serviceTypeId) {
        this.serviceTypeId = serviceTypeId;
    }

    public Integer getNumberOfCameras() {
        return numberOfCameras;
    }

    public void setNumberOfCameras(Integer numberOfCameras) {
        this.numberOfCameras = numberOfCameras;
    }

    public Integer getCameraType() {
        return cameraType;
    }

    public void setCameraType(Integer cameraType) {
        this.cameraType = cameraType;
    }

    public Integer getDvrChannel() {
        return dvrChannel;
    }

    public void setDvrChannel(Integer dvrChannel) {
        this.dvrChannel = dvrChannel;
    }

    public Integer getPaidAmount() {
        return paidAmount;
    }

    public void setPaidAmount(Integer paidAmount) {
        this.paidAmount = paidAmount;
    }

    public Integer getIsPaid() {
        return isPaid;
    }

    public void setIsPaid(Integer isPaid) {
        this.isPaid = isPaid;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Object getDeletedAt() {
        return deletedAt;
    }

    public void setDeletedAt(Object deletedAt) {
        this.deletedAt = deletedAt;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

    public String getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(String updatedAt) {
        this.updatedAt = updatedAt;
    }

    public List<OrderHistoryServiceAssign> getServiceAssignStatus() {
        return serviceAssignStatus;
    }

    public void setServiceAssignStatus(List<OrderHistoryServiceAssign> serviceAssignStatus) {
        this.serviceAssignStatus = serviceAssignStatus;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("id", id).append("paymentCallbackId", paymentCallbackId).append("paymentOrderid", paymentOrderid).append("customerId", customerId).append("serviceTypeId", serviceTypeId).append("numberOfCameras", numberOfCameras).append("cameraType", cameraType).append("dvrChannel", dvrChannel).append("paidAmount", paidAmount).append("isPaid", isPaid).append("status", status).append("deletedAt", deletedAt).append("createdAt", createdAt).append("updatedAt", updatedAt).append("serviceAssignStatus", serviceAssignStatus).toString();
    }

}

api服务

package com.tesmachino.saycure.network;
import com.tesmachino.saycure.entities.OrderHistory.OrderHistoryResponse;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;


public interface ApiService {

    @GET("order-history")
    Call<OrderHistoryResponse> orderHistory();

}

RetrofitBuilder

package com.tesmachino.saycure.network;

import com.facebook.stetho.okhttp3.StethoInterceptor;

import com.tesmachino.saycure.Auth.TokenManager;
import com.tesmachino.saycure.BuildConfig;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.moshi.MoshiConverterFactory;

public class RetrofitBuilder {

    private static final String BASE_URL = "http://192.168.1.11/say-cure-web/public/api/";
//    private static final String BASE_URL = "http://saycure.tesmachino.xyz/api/";

    private final static OkHttpClient client = buildClient();
    private final static Retrofit retrofit = buildRetrofit(client);

    private static OkHttpClient buildClient() {

        OkHttpClient.Builder builder = new OkHttpClient.Builder()

                .addInterceptor(new Interceptor() {

                    @Override
                    public Response intercept(Chain chain) throws IOException {

                        Request request = chain.request();

                        Request.Builder builder = request.newBuilder()
                                .addHeader("Accept", "application/json")
                                .addHeader("Connection", "close");

                        request = builder.build();
                        return chain.proceed(request);

                    }
                });

        if (BuildConfig.DEBUG) {
            builder.addNetworkInterceptor(new StethoInterceptor());
        }

        return builder.build();
    }

    private static Retrofit buildRetrofit(OkHttpClient client) {
        return new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(MoshiConverterFactory.create())
                .build();
    }

    public static <T> T createService(Class<T> service) {

        return retrofit.create(service);
    }

    public static <T> T createServiceWithAuth(Class<T> service, TokenManager tokenManager) {

        OkHttpClient newClient = client.newBuilder().addInterceptor(new Interceptor() {

            @Override
            public Response intercept(Chain chain) throws IOException {

                Request request = chain.request();

                Request.Builder builder = request.newBuilder();

                if (tokenManager.getToken().getAccessToken() != null) {
                    builder.addHeader("Authorization", "Bearer " + tokenManager.getToken().getAccessToken());
                }

                request = builder.build();
                return chain.proceed(request);

            }
        }).build();

        Retrofit newRetroFit = retrofit.newBuilder().client(newClient).build();
        return newRetroFit.create(service);
    }

    public static Retrofit getRetrofit() {
        return retrofit;
    }
}

对此的任何帮助将不胜感激。如果我的问题不清楚,请告诉我,我很乐意重新表述。请解释一下它最后是如何工作的

最佳答案

  • 在您的 OrderHistoryActivity Activity 中,采用 XML 格式的 RecyclerView 并在 OrderHistoryActivity.java 中创建对象。

  • 创建item.xml文件
    注意:这是必需的,因为您对 viewHolder 使用 activity_order_history (OrderHistoryActivity xml 文件),这是错误的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/orderid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>



</LinearLayout>

  • 现在将 OrderHistoryRecyclerAdapter.java 修改为:

package com.tesmachino.saycure;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.tesmachino.saycure.entities.OrderHistory.OrderHistoryResponse;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;


public class OrderHistoryRecyclerAdapter extends RecyclerView.Adapter<OrderHistoryRecyclerAdapter.ViewHolder> {

 private List<OrderHistoryGet> data;


  public OrderHistoryRecyclerAdapter(List<OrderHistoryGet> data){
          this.data = data;
   }
    @NonNull
    @Override
    public OrderHistoryRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item.xml, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull OrderHistoryRecyclerAdapter.ViewHolder holder, int position) {

      OrderHistoryGet obj = data.get(position);

      holder.order_id.setText(obj.getId()+"");

    }

    @Override
    public int getItemCount() {

        return data.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView order_id;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            order_id = (TextView) itemView.findViewById(R.id.orderid);

        }
    }
}


现在在 onResponse 方法中执行此操作。

   ....

@Override
public void onResponse(Call<OrderHistoryResponse> call, Response<OrderHistoryResponse> response) {
                Toast.makeText(OrderHistoryActivity.this, "" + response.body().getData(), Toast.LENGTH_SHORT).show();
     runOnUiThread(new Runnable() {
            @Override
            public void run() {
                OrderHistoryRecyclerAdapter adapter = new OrderHistoryRecyclerAdapter(response.body().getData());

      //This recyclerView object should create before,  like      findViewById(R.id.recyclerViewIdinXML)


         RecyclerView.LayoutManager manager=new LinearLayoutManager(getContext());
        ((LinearLayoutManager) manager).setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);
         recyclerView.setAdapter(adapter);


            }
        });
    }

   ...

就是这样。

关于java - 如何使用 Retrofit + Moshi 创建 Recycler View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59906990/

相关文章:

android - 如何在 Android Studio 中访问 Android 引用

android - Retrofit - 如何将 Response 转换为 HashMap?

android - 如何使用 retofit2 和 RxAndroid 取消请求

java - 存储二维数据的数据结构的想法?

java - JComboBox弹出动态人口

java - 将取款次数设置为 3 并在 Junit 测试中对其进行测试。

android - 如何在android中使用文件大小大于 Assets 文件夹的自定义字体?

java - 为 Applet 指定代码路径

java - Android - 如何从 Sdcard 获取文件字节

java - Square Retrofit Client : How to enable/disable followRedirects? 如何拦截重定向URL?