要用的依赖
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" />