Android簡單使用retrofit實現左右聯動

效果圖

在這裏插入圖片描述

所需依賴

依賴較多

implementation ‘com.jakewharton:butterknife:10.2.1’//Butterknife配置
annotationProcessor ‘com.jakewharton:butterknife-compiler:10.2.1’//Butterknife註解處理器
implementation ‘com.github.bumptech.glide:glide:4.10.0’//圖片加載框架

implementation 'androidx.recyclerview:recyclerview:1.1.0'//recycerview


implementation 'org.greenrobot:eventbus:3.1.1' //eventbus 事件總線,傳值
//retrofit核心庫
implementation 'com.squareup.retrofit2:retrofit:2.6.2'

//retrofit輔助,gson解析的庫
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.2' // 必要依賴,和Rxjava結合必須用到,下面會提到
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'//切換到主線程的依賴

//okhttp日誌攔截器
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'

首先先創建左右側的Entity

創建ApiService接口

public interface ApiService {
@GET(“左側尾部地址”)
Observable < LeftEntity > getResult();
//Observable導io包,左側Entity的名稱及獲取的集合名稱
@GET(“右側尾部地址”)
Observable< RightEntity > getRight(@QueryMap HashMap<String,String> params);
//右側Entity的名稱及獲取的集合名稱(獲取map,創建Hasmap)
}

創建RetrofitUtils工具類

public class RetroitUtils {
private static RetroitUtils retroit;
private final Retrofit retrofit;

public RetroitUtils() {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .build();

    retrofit = new Retrofit.Builder()
            .baseUrl("左右側前段相同地址")
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
}

public static RetroitUtils getInstance() {
    if (retroit==null){
        synchronized (RetroitUtils.class){
            if (retroit==null){
                retroit=new RetroitUtils();
            }
        }
    }
    return retroit;
}

public <T>T createservice(Class<T> tClass){
    T t = retrofit.create(tClass);
    return t;
}

}

創建MVP的conntract契約接口

public interface INewsConntract {
interface IModel extends BaseModel{
interface ModelCallBack{
void success(Object obj);
void failure(Throwable throwable);
}
void getLeft(ModelCallBack modelCallBack);
void getRight(HashMap<String,String> params,ModelCallBack modelCallBack);
}
interface IView{
void success(Object obj);
void failure(Throwable throwable);
}
interface IPresenter{
void getLeft();
void getRight(HashMap<String,String> params);
}
}

創建MVP的M層

需要繼承契約類對應的接口

public class Model implements INewsConntract.IModel {

@Override
public void getLeft(ModelCallBack modelCallBack) {
    RetroitUtils.getInstance().createservice(ApiService.class)//創建服務
            .getResult()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<LeftEntity>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(LeftEntity leftEntity) {
                    modelCallBack.success(leftEntity);
                }

                @Override
                public void onError(Throwable e) {
                    modelCallBack.failure(e);
                }

                @Override
                public void onComplete() {

                }
            });
}

@Override
public void getRight(HashMap<String, String> params, ModelCallBack modelCallBack) {
    RetroitUtils.getInstance().createservice(ApiService.class)
            .getRight(params)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<RightEntity>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(RightEntity rightEntity) {
                    modelCallBack.success(rightEntity);
                }

                @Override
                public void onError(Throwable e) {
                    modelCallBack.failure(e);

                }

                @Override
                public void onComplete() {

                }
            });

}

}

創建MVP的P層

需要繼承契約類對應的接口

public class Presenter implements INewsConntract.IPresenter {
private INewsConntract.IView iView;
private Model model;

public Presenter(INewsConntract.IView iView) {
    this.iView = iView;
    this.model = new Model();
}

@Override
public void getLeft() {
    model.getLeft(new INewsConntract.IModel.ModelCallBack() {
        @Override
        public void success(Object obj) {
            iView.success(obj);
        }

        @Override
        public void failure(Throwable throwable) {
            iView.failure(throwable);
        }
    });

}

@Override
public void getRight(HashMap<String, String> params) {

    model.getRight(params, new INewsConntract.IModel.ModelCallBack() {
        @Override
        public void success(Object obj) {
            iView.success(obj);
        }

        @Override
        public void failure(Throwable throwable) {
            iView.failure(throwable);
        }
    });
}

}

顯示界面xml設置

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_left"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="match_parent"/>
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_right"
    android:layout_width="0dp"
    android:layout_weight="3"
    android:layout_height="match_parent"/>

顯示層的Activity

#### 需要繼承契約類對應的view層接口,這裏用到了ButterKnife及EventBus

public class MainActivity extends AppCompatActivity implements INewsConntract.IView {

@BindView(R.id.rv_left)
RecyclerView rvLeft;
@BindView(R.id.rv_right)
RecyclerView rvRight;
private Presenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    presenter = new Presenter(this);
    ButterKnife.bind(this);
    EventBus.getDefault().register(this);
    rvLeft.setLayoutManager(new LinearLayoutManager(this));
    rvRight.setLayoutManager(new GridLayoutManager(this,2));
    if (RetroitUtils.getInstance().isNet()){
        presenter.getLeft();
    }
}

@Override
public void success(Object obj) {
    if (obj instanceof LeftEntity){

        List<LeftEntity.ResultBean.SecondCategoryVoBean> secondCategoryVo = ((LeftEntity) obj).getResult().get(0).getSecondCategoryVo();
        LeftAdapter leftAdapter = new LeftAdapter(this, secondCategoryVo);
        rvLeft.setAdapter(leftAdapter);

        leftAdapter.setLeftClick(new LeftAdapter.LeftClick() {
            @Override
            public void leftItemClick(String id) {
                EventBus.getDefault().post(id);
            }
        });

    }else if (obj instanceof RightEntity){
        List<RightEntity.Right> result = ((RightEntity) obj).result;
        RightAdapter rightAdapter = new RightAdapter(this,result);
        rvRight.setAdapter(rightAdapter);
    }
}

@Override
public void failure(Throwable throwable) {

}

@Subscribe(threadMode = ThreadMode.MAIN)
public void getId(String id){
    HashMap<String, String> params = new HashMap<>();
    params.put("categoryId",id);
    params.put("page","1");
    params.put("count","10");
    presenter.getRight(params);
}

}

左側的適配器配置

public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.MyViewHolder> {

private final Context context;
private final List<LeftEntity.ResultBean.SecondCategoryVoBean> secondCategoryVo;

public LeftAdapter(Context context, List<LeftEntity.ResultBean.SecondCategoryVoBean> secondCategoryVo) {

    this.context = context;
    this.secondCategoryVo = secondCategoryVo;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View inflate = View.inflate(context, R.layout.item, null);
    MyViewHolder myViewHolder = new MyViewHolder(inflate);
    return myViewHolder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.tv.setText(secondCategoryVo.get(position).getName());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            leftClick.leftItemClick(secondCategoryVo.get(position).getId());
        }
    });
}

@Override
public int getItemCount() {
    return secondCategoryVo.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.tv)
    TextView tv;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}
private LeftClick leftClick;

public void setLeftClick(LeftClick leftClick) {
    this.leftClick = leftClick;
}

public interface LeftClick{
    void leftItemClick(String id);
}

}

右側的適配器配置

public class RightAdapter extends RecyclerView.Adapter<RightAdapter.MyViewHolder> {
private final Context context;
private final List<RightEntity.Right> result;

public RightAdapter(Context context, List<RightEntity.Right> result) {
    this.context = context;
    this.result = result;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = View.inflate(context, R.layout.right_item, null);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.tv.setText(result.get(position).commodityName);

    Glide.with(context).load(result.get(position).masterPic)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .into(holder.iv);
}

@Override
public int getItemCount() {
    return result.size();
}

class MyViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.iv)
    ImageView iv;
    @BindView(R.id.tv)
    TextView tv;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
    }
}

}

僅僅簡單的實現,適合初學者參考學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章