Android ,MVP+retrofit +rxjava+glide recyclerview使用详解 ,条目点击 长按点击,三种管理器 ,分割线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bbtianshi/article/details/84855502

首先是对应的依赖 

implementation 'com.android.support:recyclerview-v7:26.1.0'

下面是对应的适配器 里面对应的 有点击的注释

public class HomeAdaper extends RecyclerView.Adapter {
    Context context;
    List<News.DataBean> list;


    public HomeAdaper(Context context, List<News.DataBean> list) {
        this.context = context;
        this.list = list;
    }
//点击事件
    public interface OnItemClickLitener {
        void onItemClick(View view, int position);
    }
    private OnItemClickLitener mOnItemClickLitener;
    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }
//长按点击事件
public interface OnItemLongClickListener{
    void onItemLongClick(View view,int position);
}
    private OnItemLongClickListener mOnItemLongClickListener;

    public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        MyViewHolder holder = new MyViewHolder(LayoutInflater.from( context).inflate(R.layout.recylce, null,false));

        return holder;


    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {


        MyViewHolder holder1 = (MyViewHolder) holder;
        holder1.tv.setText(list.get(position).getNews_title());



        //使用glide加载图片
        Glide.with(context)
                .load(list.get(position).getPic_url()) //加载地址
                .placeholder(R.mipmap.ic_launcher)//加载未完成时显示占位图
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .into(holder1.img);//显示的位置

        /*  holder1.img.setImageResource(list.get(position).getPic_url());*/
/*
        holder1.draweeView1.setImageURI(list.get(position).getPic_url());
        //创建DraweeController
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                //重试之后要加载的图片URI地址
                .setUri(list.get(position).getPic_url())
                //设置点击重试是否开启
                .setTapToRetryEnabled(true)
                //动画播放
                .setAutoPlayAnimations(true)
                //设置旧的Controller
                .setOldController(holder1.draweeView1.getController())
                //构建
                .build();
        //设置DraweeController
        holder1.draweeView1.setController(controller);
*/
//点击事件
        if (mOnItemClickLitener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemClick(holder.itemView, pos);
                }
            });

        }


//长按点击事件
        if(mOnItemLongClickListener != null){
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int position = holder.getLayoutPosition();
                    mOnItemLongClickListener.onItemLongClick(holder.itemView,position);
                    //返回true 表示消耗了事件 事件不会继续传递
                    return true;
                }
            });
        }

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {


        ImageView img;
        TextView tv;

        public MyViewHolder(View view) {
            super(view);
            tv = (TextView) view.findViewById(R.id.tv);
            img = (ImageView) view.findViewById(R.id.img);

        }


    }

下面我们来看Activity ,重点看注释

public class MainActivity extends AppCompatActivity  implements IView {
 RecyclerView recycler;
 HomeAdaper homeadper;
 UserPresenter userPresenter;
 List<News.DataBean> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycler = (RecyclerView)findViewById(R.id.recycler);
        //recycler三中管理器效果 1:默认 2:仿gridview 3:瀑布:
        //recycler.setLayoutManager(new LinearLayoutManager(this));
       // recycler.setLayoutManager(new GridLayoutManager(this,2));//3就是默认三个一排自己调试
        recycler.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));
        //系统自带分割线
        recycler.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        userPresenter = new UserPresenter(this);
        userPresenter.getUser(Api.HOME_URL);
    }
    @Override
    public void getNews(ArrayList<News.DataBean> list) {
        recycler.setAdapter(homeadper =new HomeAdaper(MainActivity.this,list));
//recyclerview条目点击事件
homeadper.setOnItemClickLitener(new HomeAdaper.OnItemClickLitener() {
    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(MainActivity.this," click "+position,Toast.LENGTH_SHORT).show();
        //下标判断事件
      //  switch (position) { case 0: Toast.makeText(MainActivity.this," 下标 "+position,Toast.LENGTH_SHORT).show(); }
    }
});
//recyclerview条目长按点击事件
        homeadper.setOnItemLongClickListener(new HomeAdaper.OnItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(MainActivity.this,"long click "+position,Toast.LENGTH_SHORT).show();
            }
        });
    }
}

 下面是对应的我的mvp 

我的图片框架是glide 下面是对应的依赖 ,切记 网络访问权限 

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 implementation 'com.squareup.retrofit2:retrofit:2.0.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    implementation 'io.reactivex:rxandroid:1.1.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.android.support:recyclerview-v7:26.1.0'
    //静态图片
  //  implementation 'com.facebook.fresco:fresco:0.12.0'
    // 支持 GIF 动图,需要添加
    //    implementation 'com.facebook.fresco:animated-gif:0.12.0'
    implementation 'com.android.support:design:26.1.0'
    compile 'com.github.bumptech.glide:glide:3.7.0'

MVP 如图:

View层

public interface IView {
    void getNews(ArrayList<News.DataBean> list);

}

下面是MODEL层

public interface IModel {
    void getUrl(String url);

}
public class UserModel implements IModel {

    ArrayList<News.DataBean> list;
    private OnFinish onFinish;

    public interface OnFinish{
        void OnFinishListener(ArrayList<News.DataBean> list);
    }

    public void setOnFinish(OnFinish onFinish){
        this.onFinish = onFinish;
    }
    @Override
    public void getUrl(String url) {
        list = new ArrayList<>();
        Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

        ApiService apiService = retrofit.create(ApiService.class);
        Observable<News> homes = apiService.getHomes();

        homes.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<News>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(News news) {
                        list = (ArrayList<News.DataBean>) news.getData();

                        onFinish.OnFinishListener(list);
                    }
                });
    }
}

p层

public class UserPresenter implements UserModel.OnFinish {

    private final IView userView;
    private final UserModel userModel;

    public UserPresenter(IView userView) {
        this.userView = userView;
        this.userModel = new UserModel();
        userModel.setOnFinish(this);
    }

    public void getUser(String url){
        userModel.getUrl(url);
    }

    @Override
    public void OnFinishListener(ArrayList<News.DataBean> list) {
        userView.getNews(list);
    }



}

下面是对应的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.samsung.wangluoqingqiu.MainActivity">


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

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


</LinearLayout>

适配器子条目布局 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"

    >
<LinearLayout
    android:layout_marginLeft="10dp"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:gravity="center"
        android:id="@+id/tv"
        android:text="测试"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView

        android:id="@+id/img"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>


</LinearLayout>

Activity在最上面还有适配器 ,适配器里面是用的glide 对应下面是Fresco 根据自己的喜好来决定,这里有一个坑用fresco必须出初始化在 在 APPlication ,如果不是用的frosce就可以省略 要是用了 对应要在清单文件里面.name.Myapp程序入口

public class Myapp extends Application {
    public  static Myapp mInstance;
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;

       // Fresco.initialize(this);


    }
    public static Myapp getInstance() {
        return mInstance;
    }






}
android:name=".bean.Myapp"

下面对应的事两个接口 里面是接口地址

public class Api {
    public static final String HOME_URL="http://api.expoon.com/AppNews/getNewsList/";
}
public interface ApiService{
/*    http://api.expoon.com/AppNews/getNewsList/type/1/p/1*/
    @GET("type/1/p/1")
    Observable<News> getHomes();
}

好了 MVP +rajava +retrofit +glide +recylerview完成,核心就是接口回调 降低磨合度  ,

下面就是效果图

猜你喜欢

转载自blog.csdn.net/bbtianshi/article/details/84855502