Livedata ViewModel 以及BaseAdapter封装,你肯定不了解一下吗?

开篇:

本文使用了livedata、viewmodel、glide4.0以上版本,封装了BaseActivity、BaseFragment、BaseHolder、BaseAdapter(还有简单的BaseApplication),感受也是棒棒的呢,固然本人仍是一个实习小菜鸟,若有写的不对的地方请多多指教,也能够交流一下怎么学习啦!!!java

 

                                                                                           看一下效果android

                                                                                               导入依赖git

implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    //Butterknife
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    //ViewModel  livedata
    implementation 'android.arch.lifecycle:extensions:1.1.0'
    annotationProcessor "android.arch.lifecycle:compiler:1.1.0"
    //Glide 4.6
    implementation 'com.github.bumptech.glide:glide:4.6.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.6.1'
    //Retrofit2
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

那么下面就开始走起,咱们的代码之路,向着码农前进,哈哈(*๓´╰╯`๓)♡github

先从封装开始介绍:web

BaseAcitvityapi

package com.example.asus.detailsnew.base;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.asus.detailsnew.R;

import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * Created by asus on 2019/1/7.
 */

public abstract class BaseActivity extends AppCompatActivity {
    private Context context;
    private Unbinder unbinder;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(ininLayout());
        context = this;
        unbinder = ButterKnife.bind(this);
        initView();
    }

    public Context getContext() {
        return context;
    }

    protected abstract int ininLayout();

    protected abstract void initView();

    public void initToolbar(Toolbar toolbar, TextView textView, String title,boolean isBack) {
        if (textView != null && title != null) {
            textView.setText(title);
        }
        if (toolbar != null) {
            toolbar.setTitle("");
            if (isBack) {
                toolbar.setNavigationIcon(R.drawable.ic_left);
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finish();
                    }
                });
            }

        }
    }

    public void ShowToast(String msg) {
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }

    public void startActivity(Activity activity, Class<? extends Activity> cls) {
        Intent intent = new Intent();
        intent.setClass(activity, cls);
        startActivity(intent);
        overridePendingTransition(R.animator.up_in,R.animator.up_out);
    }

    public  void startActivity(Activity activity, Class<? extends Activity> cls, Bundle bundle) {
        if (activity != null && cls != null && bundle != null) {
            Intent intent = new Intent();
            intent.putExtras(bundle);
            intent.setClass(activity, cls);
            startActivity(intent);
            overridePendingTransition(R.animator.up_in,R.animator.up_out);
        }

    }

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

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.animator.down_in,R.animator.down_out);
    }
}

还有BaseFragment的封装,不过也很类似啦,篇幅有限,先介绍BaseAdapter啦٩(๑^o^๑)۶app

BaseHolderide

package com.example.asus.detailsnew.base;

import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.asus.detailsnew.utils.GlideApp;

/**
 * Created by asus on 2019/1/14.
 */
public class BaseHolder extends RecyclerView.ViewHolder {
    private View itemView;
    private SparseArray<View> views;

    public BaseHolder(@NonNull View itemView) {
        super(itemView);
        this.itemView = itemView;
        views = new SparseArray<>();
    }

    public View getItemView() {
        return itemView;
    }

    public <T extends View> View getViewId(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            views.put(viewId, view);  //   控件id的int类型  控件view
        }
        return (T) view;
    }

    public static <T extends BaseHolder> T getHolder(int layoutId, ViewGroup parent) {
        return (T) new BaseHolder(LayoutInflater.from(BaseApplication.getmContext()).inflate(layoutId, parent, false));
    }

    public BaseHolder setOnClickListener(int viewId, View.OnClickListener onClickListener) {
        getViewId(viewId).setOnClickListener(onClickListener);
        return this;
    }

    public BaseHolder setText(int viewId, String msg) {
        ((TextView) getViewId(viewId)).setText(msg);
        return this;
    }

    public BaseHolder setText(int viewId, int resId) {
        ((TextView) getViewId(viewId)).setText(resId);
        return this;
    }

    public BaseHolder setImageView(int ImageViewId, String url) {
        GlideApp.with(BaseApplication.getmContext()).load(url).into((ImageView) getViewId(ImageViewId));
        return this;
    }

    public BaseHolder setImageView(int imagViewId, int resId) {
        ((ImageView) getViewId(imagViewId)).setImageResource(resId);
        return this;
    }


    public BaseHolder setImageView(int imagViewId, Bitmap bitmap) {
        ((ImageView) getViewId(imagViewId)).setImageBitmap(bitmap);
        return this;
    }
}

这里面要讲一下Glide4.0之后如何使用GlideApp(*๓´╰╯`๓)♡,通常状况下是找不到GlideApp的,多是我太可爱惹,被我发现了GlideApp,O(∩_∩)O有点扯淡,介绍一下在4.0之后是要介这样子操做一下学习

哦,不别打人,是这样子操做一下(≧ω≦)/ui

package com.example.asus.detailsnew.utils;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

/**
 * Created by asus on 2019/1/14.
 */
@GlideModule
public class GlideConfig extends AppGlideModule {
    //禁止解析Manifest
    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }
}

而后Build->Rebuild Project  就能够找到GlideApp了٩(๑^o^๑)۶

有点扯远了,这下子介绍了BaseHolder,真的下面就讲           BaseAdapter

package com.example.asus.detailsnew.base;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by asus on 2019/1/14.
 */
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> {
    private List<T> datas;
    private int [] layoutIds;

    //多种item
    public BaseAdapter(List<T> datas, int[] layoutIds) {
        this.datas = datas;
        this.layoutIds = layoutIds;
    }

    //单个item
    public BaseAdapter(List<T> datas,int layoutId){
        this.datas=datas;
        this.layoutIds=new int[]{layoutId};
    }
    
    @NonNull
    @Override
    public BaseHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return BaseHolder.getHolder(layoutIds[i],viewGroup);
    }

    @Override
    public void onBindViewHolder(@NonNull BaseHolder holder, int position) {
                onBinDatas(holder,datas.get(position),position);
    }

    protected abstract void onBinDatas(BaseHolder holder, T t, int position);

    @Override
    public int getItemCount() {
        return datas==null?0:datas.size();
    }
}

还有BaseAdapter的具体实现子类ヾ(@^▽^@)ノ 

package com.example.asus.detailsnew.adapter;

import com.example.asus.detailsnew.base.BaseAdapter;
import com.example.asus.detailsnew.base.BaseHolder;

import java.util.List;

/**
 * Created by asus on 2019/1/14.
 */
public abstract class MutiLayoutAdapter<T> extends BaseAdapter<T> {
    public MutiLayoutAdapter(List<T> datas, int[] layoutIds) {
        super(datas, layoutIds);
    }

    @Override
    public int getItemViewType(int position) {
        return getItemType(position);
    }

    protected abstract int getItemType(int position);  //区分多个item的

    @Override
    protected void onBinDatas(BaseHolder holder, T t, int position) {
        onBind(holder,t,position,getItemType(position));
    }

    protected abstract void onBind(BaseHolder holder, T t, int position,int itemType);
}

下面在讲一下ViewModel

package com.example.asus.detailsnew.http.model;

import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;
import android.util.Log;

import com.example.asus.detailsnew.http.manager.HttpManager;
import com.example.asus.detailsnew.http.manager.NewsApi;
import com.example.asus.detailsnew.ui.bean.DataBean;
import com.example.asus.detailsnew.ui.bean.Result;
import com.example.asus.detailsnew.ui.bean.ResultBean;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by asus on 2019/1/14.
 */
public class DataViewModel extends ViewModel {
    MutableLiveData<List<DataBean>> liveData = new MutableLiveData<>();
    HttpManager manager = new HttpManager();
    NewsApi api = manager.getRetrofit().create(NewsApi.class);

    public MutableLiveData<List<DataBean>> getLiveData(String type) {
        api.getNews(type, "bc0a3a53be1e97115c2313e638662cae").enqueue(new Callback<Result<ResultBean<DataBean>>>() {
            @Override
            public void onResponse(Call<Result<ResultBean<DataBean>>> call, Response<Result<ResultBean<DataBean>>> response) {
                if (response != null) {
                    liveData.setValue(response.body().getResult().getData());
                   // Log.i("是否有数据",response.body().getData().size()+"");
                }
            }

            @Override
            public void onFailure(Call<Result<ResultBean<DataBean>>> call, Throwable t) {

            }
        });
        return liveData;
    }
}

以及最终的Activity与Fragment使用

package com.example.asus.detailsnew.ui.activity;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.widget.TextView;

import com.example.asus.detailsnew.R;
import com.example.asus.detailsnew.base.BaseActivity;
import com.example.asus.detailsnew.ui.fragment.NewsFragment;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;

public class MainActivity extends BaseActivity {


    @BindView(R.id.title)
    TextView mTitle;
    @BindView(R.id.toolbar)
    Toolbar mToolbar;
    @BindView(R.id.tab_layout)
    TabLayout mTabLayout;
    @BindView(R.id.view_Pager)
    ViewPager mViewPager;
    private String[] mTitles = {"头条", "社会", "国内", "国际", "娱乐"};
    List<Fragment> fragmentList = new ArrayList<>();

    @Override
    protected int ininLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        initToolbar(mToolbar, mTitle, "哈哈新闻", false);
        for (int i = 0; i < mTitles.length; i++) {
            fragmentList.add(NewsFragment.newInstance(i));
        }
        mViewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return fragmentList.get(position);
            }

            @Override
            public int getCount() {
                return fragmentList.size();
            }

            public CharSequence getPageTitle(int position) {
                return mTitles[position];
            }
        });
        mTabLayout.setupWithViewPager(mViewPager);
    }
}
package com.example.asus.detailsnew.ui.fragment;


import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.asus.detailsnew.R;
import com.example.asus.detailsnew.adapter.MutiLayoutAdapter;
import com.example.asus.detailsnew.base.BaseApplication;
import com.example.asus.detailsnew.base.BaseFragment;
import com.example.asus.detailsnew.base.BaseHolder;
import com.example.asus.detailsnew.http.model.DataViewModel;
import com.example.asus.detailsnew.ui.bean.DataBean;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;

/**
 * A simple {@link Fragment} subclass.
 */
public class NewsFragment extends BaseFragment {

    public int position;
    @BindView(R.id.recycler)
    RecyclerView mRecycler;
    DataViewModel viewModel;
    List<DataBean> dataBeansList = new ArrayList<>();
    public static String[] Type = {"top", "shehui", "guonei", "guoji", "yule"};

    public static Fragment newInstance(int position) {
        NewsFragment fragment = new NewsFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("position", position);
        fragment.setArguments(bundle);  //setAraguments 传递一个bundler对象
        return fragment;
    }

    @Override
    protected void initData() {
        position = getArguments().getInt("position");
        //双向绑定
        viewModel = ViewModelProviders.of(this).get(DataViewModel.class);
        viewModel.getLiveData(Type[position]).observe(this, new Observer<List<DataBean>>() {
            @Override
            public void onChanged(@Nullable List<DataBean> dataBeans) {
                if (dataBeans!=null){
                    for (int i=0;i<dataBeans.size();i++){
                        dataBeansList.add(dataBeans.get(i));
                    }
                    ShowData();
                }

            }
        });
    }

    private void ShowData() {
        MutiLayoutAdapter<DataBean>  adapter=new MutiLayoutAdapter<DataBean>(dataBeansList,new int[]{R.layout.item_layout,R.layout.item}) {
            @Override
            protected int getItemType(int position) {
                Log.i("position",position+"");
                if (dataBeansList.get(position).getThumbnail_pic_s02()!=null&&dataBeansList.get(position).getThumbnail_pic_s03()!=null){
                    return 0;
                }else if (dataBeansList.get(position).getThumbnail_pic_s()!=null){
                    return 1;
                }
                return 0;
            }

            @Override
            protected void onBind(BaseHolder holder, DataBean dataBean, int position, int itemType) {
               if (itemType==0){
                   holder.setText(R.id.title, dataBean.getTitle());
                   holder.setImageView(R.id.image_left, dataBean.getThumbnail_pic_s());
                   holder.setImageView(R.id.image_center, dataBean.getThumbnail_pic_s02());
                   holder.setImageView(R.id.image_right, dataBean.getThumbnail_pic_s03());
                   holder.setText(R.id.tv_time, dataBean.getDate());
                   holder.setText(R.id.tv_type, dataBean.getCategory());
               } else if (itemType == 1) {
                   holder.setText(R.id.tv_title, dataBean.getTitle());
                   holder.setText(R.id.tv_time, dataBean.getDate());
                   holder.setText(R.id.tv_type, dataBean.getCategory());
                   holder.setImageView(R.id.image, dataBean.getThumbnail_pic_s());
               }
               //能够传一个dataBean.getUrl(),给下一个界面用webView实现浏览
               holder.getItemView().setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {

                   }
               });
               }
        };
        mRecycler.setLayoutManager(new LinearLayoutManager(BaseApplication.getmContext(),LinearLayoutManager.VERTICAL,false));
        mRecycler.setAdapter(adapter);
    }

    @Override
    protected int initView() {
        return R.layout.fragment_news;
    }

}

后记:

这样子就实现了简单的封装体验惹(≧ω≦)/,固然仍是能够进行升级改造的,好比RecyclerView在封装一下下拉刷新和上拉加载,viewmodel和livedata的使用老实讲仍是有点头痛啊,感受仍是先把Rxjava全家桶学了比较好,由于这方面的博客多并且使用还普遍,不像viewmodel和Livedata大多数博客都是介绍什么所谓的原理并且仍是高度相市的那种,看着都头晕根本不适合实习生学习惹。

数据来源:用的是聚合新闻

demo下载(*๓´╰╯`๓)♡