RecyclerView的MVP模式简单使用

    xiaoxiao2021-03-25  89

    MVP的设计模式好处自然不言而喻,易于维护、高度解耦、健壮稳定等等,缺点嘛也有,不过总之还是优点大于缺点。一些细节、理论就不阐述了,直接来个案例吧。

    项目的整体分包如下:

    IModel层:IModel层里面有一个接口,因为数据是从天狗网上下载下来了,数据可能下载成功、失败,所以给了一个回调接口。

    public interface IModel { //model层去获得数据 void getData(CallBack callBack); }

    CallBack接口:

    public interface CallBack { void onSuccess(List<InfoBean.TngouBean> data); void onFailure(String msg); }

    Model层:实现了IModel接口。

    public class Model implements IModel { @Override public void getData(final CallBack callBack) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(ApiManager.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); retrofit.create(ApiManager.class).downloadData("1", "20").enqueue(new Callback<InfoBean>() { @Override public void onResponse(Call<InfoBean> call, Response<InfoBean> response) { //数据下载成功 InfoBean infoBean = response.body(); callBack.onSuccess(infoBean.getTngou()); } @Override public void onFailure(Call<InfoBean> call, Throwable t) { //数据下载失败 callBack.onFailure(t.toString()); } }); } }

    View层:

    public interface IView { //view层去展示数据 void showData(List<InfoBean.TngouBean> data); }

    IPresenter层:

    public interface IPresenter { //model与view层的连接纽带 void exchangeData(); }

    Presenter层:

    public class Presenter implements IPresenter { private IView iView; private Model model; public Presenter(IView iView) { //通过构造方法传入IView this.iView = iView; model = new Model(); } @Override public void exchangeData() { model.getData(new CallBack() { @Override public void onSuccess(List<InfoBean.TngouBean> data) { iView.showData(data); } @Override public void onFailure(String msg) { } }); } }

    MainActivity里(MainActivity里面的布局就是一个RecyclerView):

    public class MainActivity extends AppCompatActivity implements IView { private Presenter presenter; private RecyclerView rv; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = (RecyclerView) findViewById(R.id.rv); LinearLayoutManager manager = new LinearLayoutManager(this); rv.setLayoutManager(manager); presenter = new Presenter(this); presenter.exchangeData(); } @Override public void showData(List<InfoBean.TngouBean> data) { adapter = new MyAdapter(this, data); rv.setAdapter(adapter); } }

    网络请求:

    public interface ApiManager { String BASE_URL = "http://www.tngou.net/"; @GET("tnfs/api/list") Call<InfoBean> downloadData(@Query("page") String page, @Query("rows") String rows); }

    adapter:

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private static final String TAG = "MyAdapter"; private LayoutInflater inflater; private Context context; private List<InfoBean.TngouBean> data; public MyAdapter(Context context, List<InfoBean.TngouBean> data) { this.context = context; this.data = data; inflater = LayoutInflater.from(context); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyViewHolder(inflater.inflate(R.layout.item_layout, parent, false)); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { String url = "http://tnfs.tngou.net/image" + data.get(position).getImg(); Log.d(TAG, "onBindViewHolder: " + url); Glide.with(context).load(url).into(holder.iv); holder.tv.setText(data.get(position).getTitle()); } @Override public int getItemCount() { return data.size(); } class MyViewHolder extends RecyclerView.ViewHolder { ImageView iv; TextView tv; public MyViewHolder(View itemView) { super(itemView); iv = (ImageView) itemView.findViewById(R.id.iv); tv = (TextView) itemView.findViewById(R.id.tv); } } }

    实体类是用GsonFormat自动生成的,api接口为:http://www.tngou.net/tnfs/api/list?page=1&rows=20,有需要的自己去自动生成一下。就是这样子了,木有了。

    转载请注明原文地址: https://ju.6miu.com/read-23480.html

    最新回复(0)