版权声明:本文为博主原创文章,未经博主允许不得转载。 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完成,核心就是接口回调 降低磨合度 ,
下面就是效果图