MVP+okhttp+recyclerview

要用的依赖

implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.android.support:recyclerview-v7:28.0.0-alpha3'

要加权限

<uses-permission android:name="android.permission.INTERNET"/>

1.Modle

要展示两次数据,所以有两个bean

   1》第一个bean

public class SetMeal {
    public int id;
    public String name;
    public int restaurant_id;
    public String created_at;
    public  int __v;
    public List<Spus> spus;
}

2》第二个bean

public class Spus {
    

            public String _id;
            public int id;
            public int restaurant_id;
            public int category_id;
            public String name;
            public int praise_num;
            public String praise_content;
            public int month_saled;
            public String month_saled_content;
            public String pic_url;
            public int __v;
            public String created_at;

}

3》RootData

public class RootData {
    public int status;
    public String message;
    public List<SetMeal> data;
}

4》Util包(封装OKhttp)

ok类

public class OK {

    private static OK ok;

    private static OkHttpClient client;

    private static Handler handler;

    protected static Handler getHandler() {
        return handler;
    }

    private OK() {
        client = new OkHttpClient.Builder()
                //TODO 拦截器,打印日志
                .build();

        handler = new Handler();
    }

    /**
     * 获得单例
     *
     * @return
     */
    public static OK getOk() {
        if (ok == null) {
            synchronized (OK.class) {
                if (ok == null) {
                    ok = new OK();
                }
            }
        }
        return ok;
    }

    /**
     * GET方法
     */
    public void doGet(String url, Callback callback) {
        //组装请求
        Request request = new Request.Builder()
                .url(url)
                .build();

        //初始化调用类
        Call call = client.newCall(request);

        //加入请求队列,回调结果
        call.enqueue(callback);

    }

    /**
     * POST方法
     */
    public void doPost() {

    }

}

OkCallback类

public abstract class OkCallback implements Callback{

    public abstract void onUI(String json);//更新UI
    public abstract void onFailed(String json);//返回错误信息

    @Override
    public void onFailure(Call call,final IOException e) {
        OK.getHandler().post(new Runnable() {
            @Override
            public void run() {
                onFailed(e.getMessage());
            }
        });
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        final String json=response.body().string();//注意
        OK.getHandler().post(new Runnable() {
            @Override
            public void run() {
                onUI(json);
            }
        });

    }
}

 

5》ITask请求数据接口

public interface ITask {
    public void getListData(String url, OkCallback callback);
}

6.Task实现ITask

public class Task implements ITask {
    @Override
    public void getListData(String url, OkCallback callback) {
       OK.getOk().doGet(url,callback);
    }
}

2.Presenter层

1》抽的基类

public interface BasePre {
    public void onDestroy();
}

2》IPre

public interface IPre extends BasePre{
    public void getData();
}

3》MyPre

public class MyPre extends OkCallback implements IPre {
    //注入M
    ITask task;
    //注入V
    IView view;

    public MyPre(MainActivity activity){
        task=new Task();
        view=activity;
    }
    @Override
    public void getData() {
        //获取数据
        task.getListData("http://39.108.3.12:3000/v1/food/32",this);
    }

    @Override
    public void onDestroy() {
        //销毁视图
        view=null;
    }

    @Override
    public void onUI(String json) {
        //请求数据
        Gson gson=new Gson();
        RootData rootData = gson.fromJson(json, RootData.class);
        view.ShowData(rootData.data);
    }

    @Override
    public void onFailed(String json) {

    }
}

3》View层

1》IView

public interface IView {
    void ShowData(List<SetMeal>data);
}

2》适配器

左边适配器

public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.TextHolder>{
    private Context context;
    private List<SetMeal> list;

    ItemClickListener listener;

    public void setListener(ItemClickListener listener){
        this.listener=listener;
    }
    public LeftAdapter(Context context) {
        this.context = context;
        list=new ArrayList<>();
    }
    public void AddData(List<SetMeal> meals){
       this.list.addAll(meals);
       notifyDataSetChanged();

    }

    @NonNull
    @Override
    public TextHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.left_layout, viewGroup, false);
        return new TextHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TextHolder textHolder, int i) {
        final SetMeal meal=list.get(i);
        textHolder.textView.setText(meal.name);
        textHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onItemClick(meal);
            }
        });
    }

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

   class TextHolder extends RecyclerView.ViewHolder{
     TextView textView;
       public TextHolder(@NonNull View itemView) {
           super(itemView);
           textView=itemView.findViewById(R.id.textView);
       }
   }

   public interface ItemClickListener{
        void onItemClick(SetMeal meal);
   }
}

右边适配器

public class RightAdapter extends RecyclerView.Adapter<RightAdapter.RTextHolder> {
    private Context context;
    private List<Spus> list;

    public RightAdapter(Context context) {
        this.context = context;
        list=new ArrayList<>();
    }

    public void AddData(List<Spus>spuses){
        this.list.clear();
        this.list.addAll(spuses);
        notifyDataSetChanged();
    }


    @NonNull
    @Override
    public RTextHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view= LayoutInflater.from(context).inflate(R.layout.right_layout,viewGroup,false);
        return new RTextHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RTextHolder rTextHolder, int i) {
        Spus spus=list.get(i);
        rTextHolder.textView2.setText(spus.name);
    }

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

    class RTextHolder extends RecyclerView.ViewHolder{
        TextView textView2;
        public RTextHolder(@NonNull View itemView) {
            super(itemView);
            textView2=itemView.findViewById(R.id.textView2);
        }
    }
}

主页面Activity

public class MainActivity extends AppCompatActivity implements IView{

    IPre pre;

    //左边
    RecyclerView leftRecycler;
    LeftAdapter adapter;
    //右边
    RecyclerView rightRecycler;
    RightAdapter rightAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        leftRecycler=findViewById(R.id.recycler);
        rightRecycler=findViewById(R.id.recycler2);
        //初始化
        pre=new MyPre(this);
        //加载数据
        pre.getData();
        initView();
    }

    private void initView() {
        //加载布局管理器
        leftRecycler.setLayoutManager(new LinearLayoutManager(this));
        //添加分割线
        leftRecycler.addItemDecoration(new DividerItemDecoration(this, OrientationHelper.VERTICAL));
        adapter=new LeftAdapter(this);
        leftRecycler.setAdapter(adapter);

        adapter.setListener(new LeftAdapter.ItemClickListener() {
            @Override
            public void onItemClick(SetMeal meal) {
                Toast.makeText(MainActivity.this,meal.name,Toast.LENGTH_SHORT).show();
                rightAdapter.AddData(meal.spus);
            }
        });

        //右边
        rightRecycler.setLayoutManager(new LinearLayoutManager(this));
        rightRecycler.addItemDecoration(new DividerItemDecoration(this, OrientationHelper.VERTICAL));
        rightAdapter=new RightAdapter(this);
        rightRecycler.setAdapter(rightAdapter);
    }

    @Override
    public void ShowData(List<SetMeal> data) {
        adapter.AddData(data);

        rightAdapter.AddData(data.get(0).spus);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        pre.onDestroy();
    }
}

4.xml文件

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="2"
    ></android.support.v7.widget.RecyclerView>
 <android.support.v7.widget.RecyclerView
     android:id="@+id/recycler2"
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:layout_weight="8"
     ></android.support.v7.widget.RecyclerView>

左边展示数据条目

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="13dp"
    android:layout_marginTop="14dp"
    android:text="TextView" />

右边展示条目

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="15dp"
    android:text="TextView" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Retrofit和OkHttp一起使用可以方便地处理网络请求。Retrofit是一个RESTful Http客户端,可以通过定义接口的方式来处理网络请求。而OkHttp是一个基于Okio库的Http客户端,它支持同步和异步请求,并提供了连接池、缓存、重定向等功能。因此,结合Retrofit和OkHttp的优点,我们可以创建一个请求公共类,用来处理所有的网络请求。 我们可以首先在公共类中定义一个OkHttpClient对象,用来创建请求的HttpClient。接着,我们可以创建一个Retrofit对象,并指定baseURL以及转化器Factory。由于我们使用的是JSON数据,我们可以使用Gson转换器来处理JSON数据。然后,我们可以定义一个接口,该接口定义了我们需要的所有请求方法。这些请求方法将返回一个Call对象,该对象用于发送异步网络请求以及实现网络请求的取消和排队行为。 在实现具体网络请求的方法时,我们可以使用Retrofit框架提供的注解来定义请求的内容。例如,我们可以使用@GET注解来定义一个GET请求,使用@Path和@Query注解来添加路径和查询参数。我们还可以使用@FormUrlEncoded注解来定义表单请求,@Part注解来定义文件上传等多种请求方式。 最后,我们可以在请求公共类中封装一些通用的请求参数,如请求头、超时时间、日志等,以便于我们在具体的网络请求中进行统一的管理。 通过以上步骤,我们可以创建一个请求公共类,使得我们可以快速方便地创建任何网络请求。这样,我们可以极大地提高我们的开发效率,同时也降低了我们代码的维护和重复代码量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值