要用的依赖
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" />
本文介绍了一个使用Android平台实现的数据展示应用案例。该应用通过两个RecyclerView分别展示不同层级的数据,并利用OkHttp进行网络请求,Gson进行JSON解析。文章详细介绍了项目的架构设计,包括Model层的Bean定义、Util包中的OkHttp封装、Presenter层的接口与实现、View层的适配器设计及Activity的布局管理。
1305

被折叠的 条评论
为什么被折叠?



