GreenDao--retrofit--fresco--eventbus--recyclerview

先对GreenDao进行配置

最外层也就是你的工程的build.gradle加上这行代码

classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
然后就是你的项目就的依赖最上方加

apply plugin: 'org.greenrobot.greendao'
然后在buildTypes方法体下加

greendao {
    schemaVersion 1
    targetGenDir 'src/main/java' //路径
    daoPackage 'com.example.greendao.dao'//生成数据库的包
}
这是它的依赖

compile 'org.greenrobot:greendao:3.2.0'
主MainActivity

public class MainActivity extends AppCompatActivity implements MainView{
    @BindView(R.id.rcv)
    RecyclerView rcv; //RecyLerView
    MainPrenter mainPrenter;  //p层的 实体类
    MainApdata mainApdata; //适配器
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        mainPrenter = new MainPrenter(this);
        mainPrenter.post();//这里是post请求  这两个请求只可以存在一个
        //mainPrenter.get();//这里是get请求
        List<DataBean> list =  App.daoSession.getDataBeanDao().loadAll();
        for (DataBean beans : list){
            System.out.println(beans.toString());
            Log.e("========",beans.toString());
        }

    }
   //成功
    @Override
    public void Suucer(NewsBean bean) {
        //布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        mainApdata = new MainApdata(this,bean);
        //设置布局管理器
        rcv.setLayoutManager(manager);
        //绑定适配器
        rcv.setAdapter(mainApdata);
    }
    //失败
    @Override
    public void Derch(Exception e) {

    }
    //内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑
        mainPrenter.data();
    }
}
主布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.greendao.MainActivity">

   <android.support.v7.widget.RecyclerView
       android:id="@+id/rcv"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

   </android.support.v7.widget.RecyclerView>

</LinearLayout>
View层

public interface MainView {
    void Suucer(NewsBean bean); //成功
    void Derch(Exception e);//失败
}
这是为网络请求做的接口

//这里是用的Retrofit做的网络请求
public interface IGetDataBase {
    //http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653
    //这是GET请求 上面那是我的请求用的网址 可以观看一下
    @GET("/toutiao/index")
   Call<NewsBean> get(@Query("key")String key);

    //这是POST请求
    @POST("/toutiao/index")
    Call<NewsBean> post(@Field("key")String Key);
}

Prenter层

public class MainPrenter {
    //WeakReference弱引用
    public WeakReference<MainView> mainView;
    private MainModle mainModle;  //modle层的实体类

    public MainPrenter(MainView mainView) {
        datach(mainView);
        this.mainModle = new MainModle();
    }
        //get请求
    public  void get(){
          //这里用modle层的实体类点它的方法 来new出来Modle的接口
        mainModle.getData(new MainMoldleInie() {
            //成功的方法
            @Override
            public void Suucer(NewsBean bean) {
                //判断如果View层的对象不为空,就把数据给view层的对象
                if (mainView!=null){
                    //赋值
                     mainView.get().Suucer(bean);

                }
            }
            //失败的方法
            @Override
            public void Derch(Exception e) {
                // 因为呦内存泄漏问题 ,所以在失败的方法里也要用非空判断
                    if (mainView!=null){
                        //赋值
                        mainView.get().Derch(e);
                    }
            }
        });
    }
    //这是Post请求
    public  void post(){
        mainModle.getData(new MainMoldleInie() {
            @Override
            public void Suucer(NewsBean bean) {
                if (mainView!=null){
                    mainView.get().Suucer(bean);
                }
            }

            @Override
            public void Derch(Exception e) {
                if (mainView!=null){
                    mainView.get().Derch(e);
                }
            }
        });
    }
    // 绑定 内存泄漏
    public  void  datach(MainView view){
        mainView = new WeakReference(view);
    }
     //解绑
     public  void  data(){
         mainView.clear();
     }
}
Modle层的接口

public interface MainMoldleInie {
    void Suucer(NewsBean bean); //成功
    void Derch(Exception e);//失败
}
Modle层的类

public class MainModle {
    //Modle层 自己定义的GET请求的方法
    public  void  getData(final MainMoldleInie moldleInie){
        //这是网络请求 用的是Modle层的接口 调用的事get请求 597b4f9dcb50e051fd725a9ec54d6653这是请求体的key
        Call<NewsBean> call = App.iGetDataBase.get("597b4f9dcb50e051fd725a9ec54d6653");
        //这里是异步请求 效率高  重写了两个方法 一个成功 一个失败
        call.enqueue(new Callback<NewsBean>() {
            //成功的方法 成功了就把NewsBean的对象传过去
            @Override
            public void onResponse(Call<NewsBean> call, Response<NewsBean> response) {
                NewsBean bean = response.body();
                moldleInie.Suucer(bean);
                //这是向数据库插入数据的操作
                App.daoSession.getDataBeanDao().insertInTx(bean.getResult().getData());

            }
                //失败了就传空
            @Override
            public void onFailure(Call<NewsBean> call, Throwable t) {
                moldleInie.Derch(new Exception(""));
            }
        });
    }
    //这是post请求  原理同上
    public  void  postData( final  MainMoldleInie moldleInie){
           Call<NewsBean> call = App.iGetDataBase.post("88f7bbc507e3ecacfaeab2b47dd8936f");
        call.enqueue(new Callback<NewsBean>() {
            @Override
            public void onResponse(Call<NewsBean> call, Response<NewsBean> response) {
                NewsBean bean = response.body();
                moldleInie.Suucer(bean);

                App.daoSession.getDataBeanDao().insertInTx(bean.getResult().getData());
            }

            @Override
            public void onFailure(Call<NewsBean> call, Throwable t) {
                moldleInie.Derch(new Exception(""));
            }
        });
    }
}
这是适配器

public class MainApdata extends RecyclerView.Adapter<MainApdata.ViewHolder> {
    Context context; //上下文
    NewsBean listBeans;  //集合
    public MainApdata(Context context,NewsBean listBeans) {
        this.context = context;
        this.listBeans = listBeans;
    }
    //加载布局
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.layout, null);
        return new ViewHolder(view);
    }
    //赋值 给参数
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.sdv.setImageURI(listBeans.getResult().getData().get(position).getThumbnail_pic_s());
        holder.tv.setText(listBeans.getResult().getData().get(position).getTitle());
        holder.tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                context.startActivity(new Intent(context, Main2Activity.class));
                EventBus.getDefault().postSticky(new EventBean("123",listBeans.getResult().getData().get(position).getTitle()));
            }
        });
    }

    @Override
    public int getItemCount() {
        return listBeans.getResult().getData().size();//三元运算符
    }
    //找控件
    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.sdv)
        SimpleDraweeView sdv;
        @BindView(R.id.tv)
        TextView tv;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

}
适配器用到的布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv"
        android:layout_width="130dp"
        android:layout_height="110dp"
        android:layout_marginLeft="10dp"
        />
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_marginLeft="10dp"
        android:text="123"
        />
</LinearLayout>
这是App用于初始化需要在清单文件注册

public class App  extends Application {
    public  static IGetDataBase iGetDataBase;  //这是定义的网络请求接口
    public static DaoSession daoSession;  //这是自动生成的Dao里的文件 它是打开数据库
    @Override
    public void onCreate() {
        super.onCreate();
        //Retrofit网络请求 这里放的是请求头  因为这里是初始化 数据先走这里 http://v.juhe.cn请求头
        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://v.juhe.cn")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        iGetDataBase=  retrofit.create(IGetDataBase.class);
       DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"test");
        SQLiteDatabase database  = helper.getWritableDatabase();
        daoSession= new DaoMaster(database).newSession();
        //Fresco图片加载的框架 初始化
        Fresco.initialize(this);
    }

}
这是 跳转后的页面 EventBus接收数据

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        EventBus.getDefault().register(this);
    }
    @Subscribe(sticky = true)
    public  void  even(EventBean eventBus){
        Toast.makeText(this, ""+ eventBus.getUrl() + "" + eventBus.getTitle(), Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}
EventBus的布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.greendao.Main2Activity">
   <TextView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:text="123"
       />
</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值