首先开始写代码之前,要做好万全的准备工作
1.依赖
2.网络权限
3.搭框架
现在开始正式写代码了,完成以上的准备工作,现在开始按照步骤一步一步慢慢来,要是因为着急少些了某一步的话,整个项目就会白板甚至是崩溃
1.V层
public interface MainView {
void success(String data);
void fail();
}
V层没有什么好说的,写两个方法:一个成功的方法 里面参数传入Data,一个失败方法,可以什么参数也不传,也可以传入一个失败方法
2.M层接口
public interface MainModel {
interface CallBackListener{
void mSuccess(String data);
void mFail();
}
void ShowData(CallBackListener listener);
}
M层接口里面的写一个展示数据的方法,里面传入一个接口回调的对象,然后在方法外面写一个接口回调
M层实现类
public class MainModelIml implements MainModel {
@Override
public void ShowData(CallBackListener listener) {
//请求数据
}
}
M层实现类要实现M层的接口,然后会重写M层接口里面的展示数据方法,本来是要在M层实现类这个方法里面请求数据的,但是因为时间关系所以我在后面的MainActivity里面直接请求数据了,所以这个方法里面就是空,不过不影响后面的效果展示.
3.P层
public interface MainPresenter {
void ShowData();
}
P层实现类
public class MainPresenterIml implements MainPresenter,MainModel.CallBackListener {
MainModel mainModel;
MainView mainView;
public MainPresenterIml(MainModel mainModel, MainView mainView) {
this.mainModel = mainModel;
this.mainView = mainView;
}
@Override
public void ShowData() {
mainModel.ShowData(this);
}
@Override
public void mSuccess(String data) {
mainView.success(data);
}
@Override
public void mFail() {
mainView.fail();
}
}
这个P层的实现类就有点意思了,实现P层接口之后,还有在实现这个M层接口里面的这个接口回调,然后会重写接口回调中的成功和失败的方法,然后实例化M层接口和V层接口,给一个构造方法,然后在展示方法中调用Model层的展示方法,在成功和失败方法里面调用V层的成功失败方法
布局文件就不说了
然后是Adapter
public class MyAdapter extends RecyclerView.Adapter {
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
private List<UserBean.ItemsBean> list = new ArrayList<>();
public void setList(List<UserBean.ItemsBean> list) {
this.list = list;
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view;
RecyclerView.ViewHolder holder = null;
switch (i){
case 0:
view = View.inflate(context, R.layout.rlv_item1,null);
holder = new MyViewHolder0(view);
break;
case 1:
view = View.inflate(context, R.layout.rlv_item2,null);
holder = new MyViewHolder1(view);
break;
case 2:
view = View.inflate(context, R.layout.rlv_item3,null);
holder = new MyViewHolder2(view);
break;
}
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
UserBean.ItemsBean bean = list.get(i);
if(viewHolder instanceof MyViewHolder0){
String title = bean.getTitle();
String desc = bean.getDesc();
((MyViewHolder0) viewHolder).desc.setText(desc);
((MyViewHolder0) viewHolder).title.setText(title);
Glide.with(context).load(bean.getImage()).into(((MyViewHolder0)viewHolder).image);
}else if(viewHolder instanceof MyViewHolder1){
List<UserBean.ItemsBean.ImagesBean> imagesBean = list.get(i).getImages();
Glide.with(context).load(imagesBean.get(0).getPic()).into(((MyViewHolder1) viewHolder).image1);
Glide.with(context).load(imagesBean.get(1).getPic()).into(((MyViewHolder1) viewHolder).image2);
Glide.with(context).load(imagesBean.get(2).getPic()).into(((MyViewHolder1) viewHolder).image3);
}else{
String title = bean.getTitle();
((MyViewHolder2) viewHolder).title.setText(title);
}
}
@Override
public int getItemViewType(int position) {
int type = list.get(position).getType();
return type;
}
@Override
public int getItemCount() {
if(list!=null){
return list.size();
}
return 0;
}
private class MyViewHolder0 extends RecyclerView.ViewHolder {
private final ImageView image;
private final TextView title;
private final TextView desc;
public MyViewHolder0(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
title = itemView.findViewById(R.id.tv_title);
desc = itemView.findViewById(R.id.tv_desc);
}
}
private class MyViewHolder1 extends RecyclerView.ViewHolder {
private final ImageView image1;
private final ImageView image2;
private final ImageView image3;
public MyViewHolder1(@NonNull View itemView) {
super(itemView);
image1 = itemView.findViewById(R.id.image1);
image2 = itemView.findViewById(R.id.image2);
image3 = itemView.findViewById(R.id.image3);
}
}
private class MyViewHolder2 extends RecyclerView.ViewHolder {
private final TextView title;
public MyViewHolder2(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tv_title);
}
}
}
多条目的Adapter跟单条目大体上没有什么大的变化,只不过是获取了一个
@Override
public int getItemViewType(int position) {
int type = list.get(position).getType();
return type;
}
获取了一个这个方法,这个方法的目的是用来在获取布局的方法中判断,如果=0执行第一种布局,如果=1就执行第二种布局,
然后在其他方法中也要做对应的判断
最后就是这个MainActivity
public class MainActivity extends AppCompatActivity {
private RecyclerView rlv;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rlv = findViewById(R.id.rlv);
//布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
rlv.setLayoutManager(manager);
//设置适配器
adapter = new MyAdapter(this);
rlv.setAdapter(adapter);
ShowData();
}
private void ShowData() {
new OkHttpUtils().get("https://code.aliyun.com/598254259/FristProject/raw/master/bw_list.txt").result(new OkHttpUtils.HttpListener() {
private List<UserBean.ItemsBean> list = new ArrayList<>();
@Override
public void success(String data) {
Gson gson = new Gson();
UserBean userBean = gson.fromJson(data, UserBean.class);
list = userBean.getItems();
adapter.setList(list);
}
@Override
public void fail(String error) {
}
});
}
}