倒依赖
//加载 图片用的包 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' //Gson implementation 'com.google.code.gson:gson:2.6.2' //recyclerView的依赖 compile 'com.android.support:recyclerview-v7:26+' // OkHttp implementation 'com.squareup.okhttp3:okhttp:3.9.0'
添加网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
android:name=".app.MyApp"
先分包
base
mvp 里面有 model view presenter
adapter
utils 有 OkHttpUtls HttpConfig
bean 包
app 包
主xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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="horizontal" tools:context="com.example.lianxi.mvp.view.activitys.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/main_rv" android:layout_width="match_parent" android:layout_height="match_parent" ></android.support.v7.widget.RecyclerView> </android.support.constraint.ConstraintLayout>
子布局1
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/item_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/item_img" android:layout_toStartOf="@+id/item_img" android:text="title" android:textSize="17sp" /> <ImageView android:id="@+id/item_img" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/item_tvv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/item_img" android:layout_marginEnd="11dp" android:layout_marginRight="11dp" android:layout_toLeftOf="@+id/item_img" android:layout_toStartOf="@+id/item_img" android:text="views" /> </RelativeLayout>
子布局2
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:textSize="17sp" /> <ImageView android:id="@+id/imageView" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/title" android:layout_marginTop="31dp" app:srcCompat="@mipmap/ic_launcher" /> <ImageView android:id="@+id/imageView2" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignTop="@+id/imageView" android:layout_centerHorizontal="true" app:srcCompat="@mipmap/ic_launcher" /> <ImageView android:id="@+id/imageView3" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignTop="@+id/imageView2" app:srcCompat="@mipmap/ic_launcher" /> <TextView android:id="@+id/pinglun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_below="@+id/imageView3" android:layout_marginEnd="23dp" android:layout_marginRight="23dp" android:layout_marginTop="12dp" android:text="评论" /> </RelativeLayout>
先写base 包里面的 BaseActivity BasePresenter IView
BaseActivity
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity{ protected P presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(provideLayoutId()); initViews(); initListener(); presenter=providePresenter(); initDatas(); } protected abstract P providePresenter(); protected abstract int provideLayoutId(); protected abstract void initDatas(); protected abstract void initListener(); protected abstract void initViews(); @Override protected void onDestroy() { presenter.onDestroy(); super.onDestroy(); } }
BasePresenter
public abstract class BasePresenter<V extends IView> { protected V view; public BasePresenter(V view){ this.view=view; initModel(); } protected abstract void initModel(); void onDestroy(){ view=null; } }
IView
public interface IView {
Context context();
}
app
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); //初始化ImageLoader //创建默认的ImageLoader配置参数 ImageLoaderConfiguration configuration = ImageLoaderConfiguration .createDefault(this); //Initialize ImageLoader with configuration. ImageLoader.getInstance().init(configuration); } public static DisplayImageOptions getOptions() { DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.mipmap.ic_launcher) // resource or drawable .showImageForEmptyUri(R.mipmap.ic_launcher) // resource or drawable .showImageOnFail(R.mipmap.ic_launcher) // resource or drawable .cacheInMemory(false) // default .cacheOnDisk(false) // default .displayer(new SimpleBitmapDisplayer()) // default .handler(new Handler()) // default .build(); return options; } }
OkHttpUtils
public class OkHttpUtils { public static OkHttpUtils oKhttpUtils; private final OkHttpClient okHttpClient; private final Handler myhandler; private OkHttpUtils() { //日志拦截器 // HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); // httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //主线程Handler myhandler = new Handler(Looper.getMainLooper()); okHttpClient = new OkHttpClient.Builder() .readTimeout(5000, TimeUnit.MILLISECONDS) .writeTimeout(5000, TimeUnit.MILLISECONDS) .connectTimeout(5000, TimeUnit.MILLISECONDS) // .addInterceptor(httpLoggingInterceptor) .build(); } public static OkHttpUtils getoKhttpUtils() { if (oKhttpUtils == null) { synchronized (OkHttpUtils.class) { if (oKhttpUtils == null) { return oKhttpUtils = new OkHttpUtils(); } } } return oKhttpUtils; } //异步get public void doGet(String url, final IOKhttpUtilsCallback ioKhttpUtilsCallback) { Request request = new Request.Builder() .get() .url(url) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onFailure(e.getMessage()); } }); } } @Override public void onResponse(Call call, Response response) throws IOException { if (response != null && response.isSuccessful()) { final String json = response.body().string(); if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onResponse(json); } }); } } else { if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onFailure("网络异常"); } }); } } } }); } //异步post public void doPost(String url, Map<String, String> map, final IOKhttpUtilsCallback ioKhttpUtilsCallback) { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : map.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } FormBody formBody = builder.build(); Request request = new Request.Builder() .post(formBody) .url(url) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onFailure(e.getMessage()); } }); } } @Override public void onResponse(Call call, Response response) throws IOException { if (response != null && response.isSuccessful()) { final String json = response.body().string(); if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onResponse(json); } }); } } else { if (ioKhttpUtilsCallback != null) { //切换到主线程 myhandler.post(new Runnable() { @Override public void run() { ioKhttpUtilsCallback.onFailure("网络异常"); } }); } } } }); } //接口回调 public interface IOKhttpUtilsCallback { void onFailure(String error); void onResponse(String json); } }
MainModel
public class MainModel { public void getNews(Integer page, final IMainModelCallback iMainModelCallback){ OkHttpUtils oKhttpUtils = OkHttpUtils.getoKhttpUtils(); oKhttpUtils.doGet(HttpConfig.MAIN_SHUJU + "?page="+page, new OkHttpUtils.IOKhttpUtilsCallback() { @Override public void onFailure(String error) { if (iMainModelCallback!=null) { iMainModelCallback.getFaild(error); } } @Override public void onResponse(String json) { MainBean mainBean = new Gson().fromJson(json, MainBean.class); int code = mainBean.getCode(); if(0==code){ if (iMainModelCallback!=null) { iMainModelCallback.getSuccess(mainBean); } }else{ if (iMainModelCallback!=null) { iMainModelCallback.getFaild("请求数据失败"); } } } }); } public interface IMainModelCallback{ void getSuccess(MainBean newsBean); void getFaild(String error); } }
MainPresenter
public class MainPresenter extends BasePresenter<MainView> { private MainModel mainModel; public MainPresenter(MainView iMainView) { super(iMainView); } @Override protected void initModel() { mainModel = new MainModel(); } public void getNews(Integer page) { mainModel.getNews(page, new MainModel.IMainModelCallback() { @Override public void getSuccess(MainBean newsBean) { if (view != null) { view.onSuccess(newsBean); } } @Override public void getFaild(String error) { if (view != null) { view.onFaild(error); } } }); } }
MainView
public interface MainView extends IView { void onSuccess(MainBean loginBean); void onFaild(String error); }
多条目适配器
public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<MainBean.DataBeanX.DataBean> list; private static final int viewType01 = 0; private static final int viewType02 = 1; public MainAdapter(List<MainBean.DataBeanX.DataBean> list) { this.list = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView01 = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item_01, parent, false); ; View itemView02 = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item_02, parent, false); ; if (viewType == viewType01) { return new MyViewHolder01(itemView01); } return new MyViewHolder02(itemView02); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { if(holder instanceof MyViewHolder01){ ((MyViewHolder01) holder).textView01.setText(list.get(position).getTitle()); ((MyViewHolder01) holder).textView02.setText(list.get(position).getComment_amount()+"评论"); String url="http://365jia.cn/uploads/"+list.get(position).getPics().get(0); ImageLoader.getInstance().displayImage(url,((MyViewHolder01) holder).imageView,MyApp.getOptions()); ((MyViewHolder01) holder).imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.OnItemClick(v,position); } }); //长按 ((MyViewHolder01) holder).imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClickListener.OnItemLongClick(v,position); return true; } }); }else if(holder instanceof MyViewHolder02){ ((MyViewHolder02) holder).textView01.setText(list.get(position).getTitle()); ((MyViewHolder02) holder).textView02.setText(list.get(position).getComment_amount()+""); String url0 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(0); String url1 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(1); String url2 = "http://365jia.cn/uploads/"+list.get(position).getPics().get(2); ImageLoader.getInstance().displayImage(url0,((MyViewHolder02) holder).imageView,MyApp.getOptions()); ImageLoader.getInstance().displayImage(url1,((MyViewHolder02) holder).imageView2,MyApp.getOptions()); ImageLoader.getInstance().displayImage(url2,((MyViewHolder02) holder).imageView3,MyApp.getOptions()); ((MyViewHolder02) holder).imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.OnItemClick(v,position); } }); ((MyViewHolder02) holder).imageView2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.OnItemClick(v,position); } }); ((MyViewHolder02) holder).imageView3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.OnItemClick(v,position); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClickListener.OnItemLongClick(v,position); return true; } }); } } @Override public int getItemViewType(int position) { List<String> pics = list.get(position).getPics(); if (pics.size() < 3) { return viewType01; } return viewType02; } @Override public int getItemCount() { return list==null ? 0 :list.size(); } public class MyViewHolder01 extends RecyclerView.ViewHolder{ private TextView textView01,textView02; private ImageView imageView; public MyViewHolder01(View itemView) { super(itemView); textView01=itemView.findViewById(R.id.item_tv); textView02=itemView.findViewById(R.id.item_tvv); imageView=itemView.findViewById(R.id.item_img); } } public class MyViewHolder02 extends RecyclerView.ViewHolder{ private TextView textView01,textView02; private ImageView imageView,imageView2,imageView3; public MyViewHolder02(View itemView) { super(itemView); textView01=itemView.findViewById(R.id.title); textView02=itemView.findViewById(R.id.pinglun); imageView=itemView.findViewById(R.id.imageView); imageView2=itemView.findViewById(R.id.imageView2); imageView3=itemView.findViewById(R.id.imageView3); } } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public interface OnItemClickListener{ void OnItemClick(View view,int position); } private OnItemLongClickListener onItemLongClickListener; public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public interface OnItemLongClickListener{ void OnItemLongClick(View view,int position); } }
MainActivity
public class MainActivity extends BaseActivity<MainPresenter> implements View.OnClickListener,MainView { private RecyclerView recyclerView; private List<MainBean.DataBeanX.DataBean> list=new ArrayList<>(); private MainAdapter mainAdapter; @Override public void onClick(View v) { } @Override public Context context() { return this; } //成功 @Override public void onSuccess(MainBean loginBean) { List<MainBean.DataBeanX.DataBean> data = loginBean.getData().getData(); list.addAll(data); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //设置适配器 mainAdapter= new MainAdapter(list); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setAdapter(mainAdapter); //点击图片改变 透明 mainAdapter.setOnItemClickListener(new MainAdapter.OnItemClickListener() { @Override public void OnItemClick(View view, int position) { ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f); alpha.setDuration(5000); alpha.start(); } }); mainAdapter.setOnItemLongClickListener(new MainAdapter.OnItemLongClickListener() { @Override public void OnItemLongClick(View view, final int position) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("数据"); builder.setMessage("确定删除吗"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { list.remove(position); mainAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消",null); builder.show(); } }); } @Override public void onFaild(String error) { } @Override protected MainPresenter providePresenter() { return new MainPresenter(this); } @Override protected int provideLayoutId() { return R.layout.activity_main; } @Override protected void initDatas() { presenter.getNews(1); } @Override protected void initListener() { } @Override protected void initViews() { recyclerView= findViewById(R.id.main_rv); } }