您的位置:首页 > 编程语言 > Java开发

MVP+Retrofit+RxJava实现分类

2017-12-08 20:40 295 查看
上一篇实现分类用的是OKHttp,这个是Retrofit+RxJava,左右两边是两个recyclerview,右边的Recyclerview里面有一个TextView和GridView,点击左边的条目实现右边数据的变化。

依赖、布局、Bean类都在上一篇就不写了直接开始代码了

先是工具类的东西了

实现GridView布局的类

public class RightGridView extends GridView{
public RightGridView(Context context) {
super(context);
}

public RightGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public RightGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expendSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expendSpec);
}
}


封装的Retrofit类

public class RetrofitManager {
private Retrofit mRetrofit;
private String baseUrl;
OkHttpClient client;//有关拦截器
private static RetrofitManager mRetrofitManager;
private RetrofitManager(){}
private RetrofitManager(String baseUrl,OkHttpClient client){
this.baseUrl=baseUrl;
this.client=client;//有关拦截器
initRetrofit();
}
public static synchronized RetrofitManager getInstance(String baseUrl,OkHttpClient client){//有关拦截器
if (mRetrofitManager == null){
mRetrofitManager = new RetrofitManager(baseUrl,client);
}
return mRetrofitManager;
}

private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)//有关拦截器
.build();
}

public <T> T setCreate(Class<T> reqServer){
return mRetrofit.create(reqServer);
}
}


public interface LeftUrl {
@GET("index.php?act=goods_class")
Observable<ClassifyLeft> getLeft();
}

public interface RightUrl {
@GET("index.php?act=goods_class&op=get_child_all&")
Observable<ClassifyRight> getRight(@Query("gc_id") String gc_id);
}


MODEL层

左边的数据
public interface ILeftDataModel {
public void getLeftData(Observer observer);
}
public class LeftDataModel implements ILeftDataModel {
@Override
public void getLeftData(Observer observer) {
OkHttpClient client=new OkHttpClient.Builder().build();
RetrofitManager.getInstance("http://169.254.194.209/mobile/",client).setCreate(LeftUrl.class).getLeft().observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(observer);
}
}
右边的数据
public interface IRightDataModel {
public void getRightData(String gc_id,Observer observer);
}
public class RightDataModel implements IRightDataModel {
@Override
public void getRightData(String gc_id, Observer observer) {
OkHttpClient client=new OkHttpClient.Builder().build();
RetrofitManager.getInstance("http://169.254.194.209/mobile/",client).setCreate(RightUrl.class).getRight(gc_id).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(observer);
}
}


View层

public interface ILeftDataView {
public void showLeft(List<ClassifyLeft.DatasBean.ClassListBean> leftlist);
}

public interface IRightDataView {
public void showRight(List<ClassifyRight.DatasBean.ClassListBean> rightlist);
public String getGc_id();
}


Presenter层

public class LeftPresenter {
LeftDataModel model;
ILeftDataView view;
List<ClassifyLeft.DatasBean.ClassListBean> leftlist=new ArrayList<>();

public LeftPresenter(ILeftDataView view) {
this.view = view;
model=new LeftDataModel();
}
public void lpGetData(){
model.getLeftData(new Observer<ClassifyLeft>(){

@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
Log.i("111111","onError");
}

@Override
public void onNext(ClassifyLeft classifyLeft) {
leftlist.addAll(classifyLeft.getDatas().getClass_list());
view.showLeft(leftlist);
Log.i("111111","onNext"+leftlist);
}
});
}
}

右边的
public class RightPresenter {
RightDataModel model;
IRightDataView view;
List<ClassifyRight.DatasBean.ClassListBean> rightlist=new ArrayList<>();

public RightPresenter(IRightDataView view) {
this.view = view;
model=new RightDataModel();
}
public void rpGetData(){
String gc_id=view.getGc_id();
model.getRightData(gc_id,new Observer<ClassifyRight>(){

@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
}

@Override
public void onNext(ClassifyRight classifyRight) {
//要先清空右边的数据再添加,不然点击左边的条目时右边的数据会出现追加的效果
rightlist.clear();
rightlist.addAll(classifyRight.getDatas().getClass_list());
view.showRight(rightlist);
}
});
}
}


下面是适配器啦

左边适配器没什么不同的
public class LeftAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
List<ClassifyLeft.DatasBean.ClassListBean> leftlist;
OnItemClickListener listener;

public LeftAdapter(Context context, List<ClassifyLeft.DatasBean.ClassListBean> leftlist) {
this.context = context;
this.leftlist = leftlist;
}

public interface OnItemClickListener{
public void OnItemClick(View view,int position);
}

public void setOnItemClick(OnItemClickListener listener){
this.listener=listener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=View.inflate(context,R.layout.left_item,null);
return new LeftHolder(view);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
((LeftHolder)holder).tv_left.setText(leftlist.get(position).getGc_name());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener!=null){
listener.OnItemClick(v,position);
}
}
});
}

@Override
public int getItemCount() {
return leftlist!=null?leftlist.size():0;
}

class LeftHolder extends RecyclerView.ViewHolder{
TextView tv_left;
public LeftHolder(View itemView) {
super(itemView);
tv_left=itemView.findViewById(R.id.tv_left);
}
}
}


右边的布局里网格布局的适配器

public class GridAdapter extends BaseAdapter{
List<String> list;
Context context;

public GridAdapter( Context context,List<String> list) {
this.list = list;
this.context = context;
}

@Override
public int getCount() {
return list!=null?list.size():0;
}

@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
GridHolder holder;
if(convertView==null){
convertView=View.inflate(context, R.layout.grid_item,null);
holder=new GridHolder();
holder.tv_grid=convertView.findViewById(R.id.tv_grid);
convertView.setTag(holder);
}else{
holder= (GridHolder) convertView.getTag();
}
holder.tv_grid.setText(list.get(position));
return convertView;
}
class GridHolder{
TextView tv_grid;
}
}


右边的Recyclerview的适配器

public class RightAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
List<ClassifyRight.DatasBean.ClassListBean> rightlist;

public RightAdapter(Context context, List<ClassifyRight.DatasBean.ClassListBean> rightlist) {
this.context = context;
this.rightlist = rightlist;
}

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

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((RightHolder)holder).tv_right_top.setText(rightlist.get(position).getGc_name());
//给GridView赋值
List<String> list=new ArrayList<>();
for(int i=0;i<rightlist.get(position).getChild().size();i++){
list.add(rightlist.get(position).getChild().get(i).getGc_name());
}
GridAdapter gridAdapter=new GridAdapter(context,list);
((RightHolder)holder).gv_right.setAdapter(gridAdapter);
}

@Override
public int getItemCount() {
return rightlist!=null?rightlist.size():0;
}
class RightHolder extends RecyclerView.ViewHolder{
TextView tv_right_top;
GridView gv_right;
public RightHolder(View itemView) {
super(itemView);
tv_right_top=itemView.findViewById(R.id.tv_right_top);
gv_right=itemView.findViewById(R.id.gv_right);
}
}
}


MainActivity中的

public class MainActivity extends AppCompatActivity implements ILeftDataView, IRightDataView {
LeftAdapter leftAdapter;
RightAdapter rightAdapter;
List<ClassifyRight.DatasBean.ClassListBean> rightlist=new ArrayList<>();
List<ClassifyLeft.DatasBean.ClassListBean> leftlist = new ArrayList<>();
String gc_id ="1";
private RecyclerView mRvLeft;
private RecyclerView mRvRight;
LeftPresenter leftPresenter;
RightPresenter rightPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
leftPresenter=new LeftPresenter(this);
showLeft(leftlist);
leftPresenter.lpGetData();
rightPresenter=new RightPresenter(this);
showRight(rightlist);
rightPresenter.rpGetData();

}

@Override
public void showLeft(final List<ClassifyLeft.DatasBean.ClassListBean> leftlist) {
LinearLayoutManager manager=new LinearLayoutManager(this);
mRvLeft.setLayoutManager(manager);
leftAdapter=new LeftAdapter(this,leftlist);
mRvLeft.setAdapter(leftAdapter);
//点击左边的item给右边的接口参数传值
leftAdapter.setOnItemClick(new LeftAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View view, int position) {
gc_id=leftlist.get(position).getGc_id();
rightPresenter.rpGetData();
rightAdapter.notifyDataSetChanged();
}
});
}

@Override
public void showRight(List<ClassifyRight.DatasBean.ClassListBean> rightlist) {
LinearLayoutManager manager=new LinearLayoutManager(this);
mRvRight.setLayoutManager(manager);
rightAdapter=new RightAdapter(this,rightlist);
mRvRight.setAdapter(rightAdapter);
}

@Override
public String getGc_id() {
return gc_id;
}

private void initView() {
mRvLeft = (RecyclerView) findViewById(R.id.rv_left);
mRvRight = (RecyclerView) findViewById(R.id.rv_right);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: