這是我的第一個頁面:MainActivity
package com.example.yuekaomoni1; import android.animation.ObjectAnimator; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private Button btn_add; private MyViewGroup mviewgroup; private int widthPixels; private int heightPixels; int i = 0; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_add = findViewById(R.id.btn_add); mviewgroup = findViewById(R.id.mviewgroup); DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); widthPixels = displayMetrics.widthPixels; heightPixels = displayMetrics.heightPixels; btn_add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_add: i++; textView = new TextView(MainActivity.this); textView.setText("这是条目" + i); textView.setWidth(widthPixels / 3); textView.setHeight(heightPixels / 30); if (i % 3 == 0) { textView.setBackgroundColor(Color.RED); } else if (i % 3 == 1) { textView.setBackgroundColor(Color.BLUE); } else { textView.setBackgroundColor(Color.YELLOW); } mviewgroup.addView(textView); animation(textView); break; } } }); mviewgroup.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("删除"); builder.setMessage("确认删除此条目吗?"); builder.setIcon(R.mipmap.ic_launcher); builder.setCancelable(true); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { i--; mviewgroup.removeViewAt(i); } }); builder.setNegativeButton("取消", null); builder.show(); return true; } }); mviewgroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); intent.putExtra("name", textView.getText().toString()); startActivity(intent); } }); } private void animation(TextView textView) { ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "translationX", -300, 0); animator.setDuration(1000); animator.start(); } }
接下來是activity_main的佈局文件
<?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=".MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="三色梯" android:textSize="25sp" /> <Button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="+" /> </RelativeLayout> <com.example.yuekaomoni1.MyViewGroup android:id="@+id/mviewgroup" android:layout_width="match_parent" android:layout_height="match_parent"></com.example.yuekaomoni1.MyViewGroup>
</LinearLayout>
然後是我們的接口
DataView
package com.example.yuekaomoni1.v; import com.example.yuekaomoni1.p.DataBeans; import java.util.List; public interface DataView { void showData( List<DataBeans.DataBeanX.DataBean> list); }Api
package com.example.yuekaomoni1.v; public interface Api { String DATA_URL = "http://365jia.cn/news/api3/365jia/news/headline"; }
IDataView
package com.example.yuekaomoni1.v; import com.example.yuekaomoni1.p.RecyclerBean; import java.util.List; public interface IDataView { void showDataView(); void reFresh(List<RecyclerBean.SongListBean> listdata); }
OnNetListener
package com.example.yuekaomoni1.v; public interface OnNetListener { void OnSuccess(String result); void OnFilder(Exception e); }
接下來是三個model
DataModel
DataModelImp
HttpUtils
package com.example.yuekaomoni1.m; import com.example.yuekaomoni1.v.OnNetListener; public interface DataModel { void showData(String page, OnNetListener onNetListener); }
package com.example.yuekaomoni1.m; import com.example.yuekaomoni1.v.Api; import com.example.yuekaomoni1.v.OnNetListener; import okhttp3.Callback; public class DataModelImp implements DataModel { @Override public void showData(String page, final OnNetListener onNetListener) { HttpUtils.getInstance().doGet(Api.DATA_URL + "?page=" + page, new OnNetListener() { @Override public void OnSuccess(String result) { onNetListener.OnSuccess(result); } @Override public void OnFilder(Exception e) { onNetListener.OnFilder(e); } }); } }
HttpUtils是封裝的工具類
package com.example.yuekaomoni1.m; import android.os.Handler; import android.os.Looper; import com.example.yuekaomoni1.HttpUtilsCallback; import com.example.yuekaomoni1.v.OnNetListener; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.security.auth.callback.Callback; import okhttp3.Call; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class HttpUtils { private static HttpUtils instance; private final OkHttpClient okHttpClient; private Handler handler; private HttpUtils() { okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build(); handler = new Handler(Looper.getMainLooper()); } public static HttpUtils getInstance() { if (instance == null) { instance = new HttpUtils(); } return instance; } public void doGet(String url, final OnNetListener onNetListener) { //创建Request final Request request = new Request.Builder() .url(url) .build(); //发送请求 okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { onNetListener.OnFilder(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String string = response.body().string(); handler.post(new Runnable() { @Override public void run() { onNetListener.OnSuccess(string); } }); } }); } }
接下來是P層
DataPresenterImp
package com.example.yuekaomoni1.p; import com.example.yuekaomoni1.m.DataModelImp; import com.example.yuekaomoni1.v.DataView; import com.example.yuekaomoni1.v.OnNetListener; import com.google.gson.Gson; import java.util.List; public class DataPresenterImp implements DataPresenter { private DataView dataView; private final DataModelImp dataModelImp; public DataPresenterImp(DataView dataView) { this.dataView = dataView; dataModelImp = new DataModelImp(); } @Override public void showData(String page) { dataModelImp.showData(page, new OnNetListener() { @Override public void OnSuccess(String result) { DataBeans dataBeans = new Gson().fromJson(result, DataBeans.class); int code = dataBeans.getCode(); DataBeans.DataBeanX data = dataBeans.getData(); List<DataBeans.DataBeanX.DataBean> listData = data.getData(); if(0 == code){ dataView.showData(listData); } } @Override public void OnFilder(Exception e) { } }); } public void cloneView(){ if(dataView != null){ dataView = null; } } }
DataBeans
package com.example.yuekaomoni1.p; import com.google.gson.Gson; import org.json.JSONException; import org.json.JSONObject; import java.util.List; public class DataBeans { /** * httpStatusCode : 200 * code : 0 * data : {"page":1,"perpage":20,"max_page":85,"total":1686,"data":[{"id":3541397,"title":"合肥新定位为全国智能家居研发生产中心 四大件产量连续多年居全国之首","link":"lsapp://cn.ahurls.news/news?id=3541397","pics":["appletrecommend/201805/5b08a30fa4712.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"","inner_news":1,"views":162,"comment_amount_label":"0","views_label":"162"},{"id":3541326,"title":"合肥此轮降雨过程将在5月26日结束 未来几日多云为主温度适宜","link":"lsapp://cn.ahurls.news/news?id=3541326","pics":["appletrecommend/201805/5b07c7396bc23.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2677,"comment_amount_label":"2","views_label":"2677"},{"id":3541361,"title":"调查:四川男子录抖音视频辱骂河南人后道歉 你怎么看?","link":"lsapp://cn.ahurls.news/news?id=3541361","pics":["appletrecommend/201805/5b08a3fb804d1.jpg"],"t":"url","type":"vote","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"投票","inner_news":1,"views":2421,"comment_amount_label":"0","views_label":"2421","pics_new":["appletrecommend/201805/5b08a3fb804d1.jpg"]},{"id":3541394,"title":"安徽岳西:子女住新房父母住危房被认定违法","link":"lsapp://cn.ahurls.news/news?id=3541394","pics":["appletrecommend/201805/5b08a3d8d1fc0.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":1,"source":"","type_sign":"","inner_news":1,"views":147,"comment_amount_label":"1","views_label":"147"},{"id":3541299,"title":"英勇!合肥登云庭小区小偷入室盗窃猥亵女业主 民警抱住小偷滚下楼梯","link":"lsapp://cn.ahurls.news/news?id=3541299","pics":["appletrecommend/201805/5b07ff30755de.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"","inner_news":1,"views":3766,"comment_amount_label":"4","views_label":"3766"},{"id":3541399,"title":"\u201c2017年世界500强\u201d中徽商占两席 王文银成为徽商企业家首富","link":"lsapp://cn.ahurls.news/news?id=3541399","pics":["appletrecommend/201805/5b08a60733c46.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"","inner_news":1,"views":73,"comment_amount_label":"0","views_label":"73"},{"id":3541302,"title":"5月25日24时安徽油价上调 92号汽油每升上调0.2元","link":"lsapp://cn.ahurls.news/news?id=3541302","pics":["appletrecommend/201805/5b07d930d0ebf.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":11,"source":"","type_sign":"","inner_news":1,"views":3373,"comment_amount_label":"11","views_label":"3373"},{"id":3540446,"title":"【专题】2018世界制造业大会合肥宣言正式发布 全球制造领域有了\u201c合肥声音\u201d","link":"lsapp://cn.ahurls.news/special?id=3540446","pics":["18/0525/5b074ce5c56d4.jpg"],"t":"url","type":"special","alias":"headline","pic_amount":0,"style":"single_fill","comment_amount":2,"source":"","type_sign":"专题","inner_news":1,"views":4582,"comment_amount_label":"2","views_label":"4582","pics_new":["18/0525/5b074ce5c56d4.jpg"]},{"id":3540693,"title":"调查:安徽班主任试喝牛奶确保安全 媒体:缺乏人性温度 你怎么看","link":"lsapp://cn.ahurls.news/news?id=3540693","pics":["appletrecommend/201805/5b073a72cbf8c.jpg"],"t":"url","type":"vote","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"投票","inner_news":1,"views":6024,"comment_amount_label":"4","views_label":"6024","pics_new":["appletrecommend/201805/5b073a72cbf8c.jpg"]},{"id":3541348,"title":"合肥蜀山区一菜市场厕所垃圾桶惊现一名死婴 警方介入调查","link":"lsapp://cn.ahurls.news/news?id=3541348","pics":["appletrecommend/201805/5b07fe759614b.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":3042,"comment_amount_label":"2","views_label":"3042"},{"id":3541039,"title":"这是一个令人振奋的消息! 合肥东部新中心来了","link":"lsapp://cn.ahurls.news/news?id=3541039","pics":["appletrecommend/201805/5b0783c941b0c.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":9,"source":"","type_sign":"","inner_news":1,"views":4000,"comment_amount_label":"9","views_label":"4000"},{"id":3541088,"title":"3岁女童因恶性肿瘤身亡 父母被指拿着捐款治疗儿子兔唇放弃女儿","link":"lsapp://cn.ahurls.news/image_news?id=3541088","pics":["special/tuku/201805/5b07a64e1a47655741.jpg","special/tuku/201805/5b07a64e2679386727.jpg","special/tuku/201805/5b07a64e0739a67091.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2870,"comment_amount_label":"2","views_label":"2870","pics_new":["special/tuku/201805/5b07a64e1a47655741.jpg"]},{"id":3540741,"title":"合肥教育局权威发布!中小学网上报名入学最新最全解答","link":"lsapp://cn.ahurls.news/news?id=3540741","pics":["appletrecommend/201805/5b07530ba7edb.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":5045,"comment_amount_label":"3","views_label":"5045"},{"id":3541009,"title":"合肥市公交换乘细则正式出炉 \u201c带人乘车刷卡\u201d不享受换乘优惠","link":"lsapp://cn.ahurls.news/news?id=3541009","pics":["appletrecommend/201805/5b07795a5df5c.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":5,"source":"","type_sign":"","inner_news":1,"views":4280,"comment_amount_label":"5","views_label":"4280"},{"id":3541029,"title":"今天凌晨合肥一辆白色轿车滑入天鹅湖 事发时车上或有人","link":"lsapp://cn.ahurls.news/news?id=3541029","pics":["appletrecommend/201805/5b077eba55a41.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":12,"source":"","type_sign":"","inner_news":1,"views":8157,"comment_amount_label":"12","views_label":"8157"},{"id":3541232,"title":"【专题】反转!王凤雅重病去世爷爷称善款剩千元 嫣然天使基金提供弟弟治兔唇钱","link":"lsapp://cn.ahurls.news/special?id=3541232","pics":["18/0525/5b07c6738acf1.jpg"],"t":"url","type":"special","alias":"headline","pic_amount":0,"style":"single_fill","comment_amount":1,"source":"","type_sign":"专题","inner_news":1,"views":2011,"comment_amount_label":"1","views_label":"2011","pics_new":["18/0525/5b07c6738acf1.jpg"]},{"id":3540737,"title":"站内何时能充值合肥通?合肥轨道公司回复市民热点问题","link":"lsapp://cn.ahurls.news/news?id=3540737","pics":["appletrecommend/201805/5b073e2513048.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"","inner_news":1,"views":4351,"comment_amount_label":"4","views_label":"4351"},{"id":3541162,"title":"活久见!男子不满女友登记时\u201c再考虑一下\u201d 一顿拳脚后两人又领证了","link":"lsapp://cn.ahurls.news/news?id=3541162","pics":["appletrecommend/201805/5b07b9a258016.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":7,"source":"","type_sign":"","inner_news":1,"views":3182,"comment_amount_label":"7","views_label":"3182"},{"id":3540754,"title":"今年合肥小学初中网上报名如何登记操作?这份\u201c入学指南\u201d请收好","link":"lsapp://cn.ahurls.news/news?id=3540754","pics":["appletrecommend/201805/5b07532313edd.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":6194,"comment_amount_label":"2","views_label":"6194"},{"id":3541169,"title":"合肥奔驰女不满物业规定 违停\u201c堵门\u201d辱骂殴打保安","link":"lsapp://cn.ahurls.news/image_news?id=3541169","pics":["special/tuku/201805/5b07ba822763455489.jpg","special/tuku/201805/5b07ba825c5e834613.jpg","special/tuku/201805/5b07ba8270df111019.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":6,"source":"","type_sign":"","inner_news":1,"views":1895,"comment_amount_label":"6","views_label":"1895","pics_new":["special/tuku/201805/5b07ba822763455489.jpg"]},{"id":3541308,"title":"流行性腮腺炎进入高发季 合肥疾控中心专家:幼儿需及时接种疫苗","link":"lsapp://cn.ahurls.news/news?id=3541308","pics":["appletrecommend/201805/5b0803117f3c6.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":1963,"comment_amount_label":"3","views_label":"1963"},{"id":3541301,"title":"女子周旋两个丈夫间5年未被发现 花钱雇老夫妻扮演自己父母","link":"lsapp://cn.ahurls.news/news?id=3541301","pics":["appletrecommend/201805/5b0802bce6c69.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":2222,"comment_amount_label":"3","views_label":"2222"},{"id":3541295,"title":"四川男子录抖音视频辱骂河南人后道歉:自己初中文化不了解地域黑","link":"lsapp://cn.ahurls.news/news?id=3541295","pics":["appletrecommend/201805/5b0801bbde00d.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2457,"comment_amount_label":"2","views_label":"2457"},{"id":3541226,"title":"【大碗视频】黑科技!直击2018世界制造业大会:应急情况加色拉油 直升机也能飞","link":"lsapp://cn.ahurls.news/news?id=3541226","pics":["appletrecommend/201805/5b08012ee91f3.jpg"],"t":"url","type":"video","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"视频","inner_news":1,"views":2539,"comment_amount_label":"2","views_label":"2539","pics_new":["appletrecommend/201805/5b08012ee91f3.jpg"]},{"id":3541213,"title":"清华北大公布2018保送生拟录取名单 合肥这两所学校学生上榜","link":"lsapp://cn.ahurls.news/news?id=3541213","pics":["appletrecommend/201805/5b07d21525ca6.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":3586,"comment_amount_label":"3","views_label":"3586"},{"id":3540757,"title":"捂脸!男子婚后压力大扮女装卖淫 嫖客得知真相当场吐了","link":"lsapp://cn.ahurls.news/news?id=3540757","pics":["appletrecommend/201805/5b0751ecf0eda.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":6107,"comment_amount_label":"3","views_label":"6107"},{"id":3541268,"title":"\u201c小猪佩奇\u201d文身贴安全吗? 部分商品无\u201c安全提示\u201d","link":"lsapp://cn.ahurls.news/news?id=3541268","pics":["appletrecommend/201805/5b07d45876402.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":1985,"comment_amount_label":"3","views_label":"1985"},{"id":3540922,"title":"64岁老汉猥亵小学女生:就为找点儿刺激","link":"lsapp://cn.ahurls.news/image_news?id=3540922","pics":["special/tuku/201805/5b076e1c36c8e31616.jpg","special/tuku/201805/5b076e1c5164d76430.jpg","special/tuku/201805/5b076e1c64ed337508.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":1986,"comment_amount_label":"2","views_label":"1986","pics_new":["special/tuku/201805/5b076e1c36c8e31616.jpg"]},{"id":3541223,"title":"四川惊现\u201c摔儿老师\u201d:抓小孩的手提起来转圈体罚","link":"lsapp://cn.ahurls.news/news?id=3541223","pics":["appletrecommend/201805/5b07cf20d38d0.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2047,"comment_amount_label":"2","views_label":"2047"},{"id":3541214,"title":"大爷替35岁女儿相亲要求有房是公务员:追求稳定的生活","link":"lsapp://cn.ahurls.news/news?id=3541214","pics":["appletrecommend/201805/5b07c4f720f6e.png"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":2206,"comment_amount_label":"3","views_label":"2206"}],"extras":{"slider":[{"id":3541393,"pic":"18/0526/5b08a55aa0724.jpg","link":"lsapp://cn.ahurls.news/news?id=3541393","t":"url","inner_news":1,"title":"来安徽旅游这5条精品路线不可错过","type":"nomal","type_sign":""},{"id":3540769,"pic":"18/0525/5b07c9c67edab.jpg","link":"lsapp://cn.ahurls.news/news?id=3540769","t":"url","inner_news":1,"title":"合肥构建未成人心理健康\u201c防护网\u201d","type":"nomal","type_sign":""},{"id":3540819,"pic":"18/0525/5b07aaec28743.jpg","link":"lsapp://cn.ahurls.news/news?id=3540819","t":"url","inner_news":1,"title":"数据告诉你\u201c合肥造\u201d到底有多强","type":"nomal","type_sign":""},{"id":3540806,"pic":"18/0525/5b076b21b1432.jpg","link":"lsapp://cn.ahurls.news/news?id=3540806","t":"url","inner_news":1,"title":"解码合肥工业经济跨越之路","type":"nomal","type_sign":""},{"id":3540583,"pic":"18/0524/5b06b8c92b95d.jpg","link":"lsapp://cn.ahurls.news/news?id=3540583","t":"url","inner_news":1,"title":"安徽一季度水质对赌结果出炉","type":"nomal","type_sign":""}]},"bindtips":""} */ private int httpStatusCode; private int code; private DataBeanX data; public static DataBeans objectFromData(String str) { return new Gson().fromJson(str, DataBeans.class); } public static DataBeans objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getString(str), DataBeans.class); } catch (JSONException e) { e.printStackTrace(); } return null; } public int getHttpStatusCode() { return httpStatusCode; } public void setHttpStatusCode(int httpStatusCode) { this.httpStatusCode = httpStatusCode; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public DataBeanX getData() { return data; } public void setData(DataBeanX data) { this.data = data; } public static class DataBeanX { /** * page : 1 * perpage : 20 * max_page : 85 * total : 1686 * data : [{"id":3541397,"title":"合肥新定位为全国智能家居研发生产中心 四大件产量连续多年居全国之首","link":"lsapp://cn.ahurls.news/news?id=3541397","pics":["appletrecommend/201805/5b08a30fa4712.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"","inner_news":1,"views":162,"comment_amount_label":"0","views_label":"162"},{"id":3541326,"title":"合肥此轮降雨过程将在5月26日结束 未来几日多云为主温度适宜","link":"lsapp://cn.ahurls.news/news?id=3541326","pics":["appletrecommend/201805/5b07c7396bc23.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2677,"comment_amount_label":"2","views_label":"2677"},{"id":3541361,"title":"调查:四川男子录抖音视频辱骂河南人后道歉 你怎么看?","link":"lsapp://cn.ahurls.news/news?id=3541361","pics":["appletrecommend/201805/5b08a3fb804d1.jpg"],"t":"url","type":"vote","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"投票","inner_news":1,"views":2421,"comment_amount_label":"0","views_label":"2421","pics_new":["appletrecommend/201805/5b08a3fb804d1.jpg"]},{"id":3541394,"title":"安徽岳西:子女住新房父母住危房被认定违法","link":"lsapp://cn.ahurls.news/news?id=3541394","pics":["appletrecommend/201805/5b08a3d8d1fc0.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":1,"source":"","type_sign":"","inner_news":1,"views":147,"comment_amount_label":"1","views_label":"147"},{"id":3541299,"title":"英勇!合肥登云庭小区小偷入室盗窃猥亵女业主 民警抱住小偷滚下楼梯","link":"lsapp://cn.ahurls.news/news?id=3541299","pics":["appletrecommend/201805/5b07ff30755de.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"","inner_news":1,"views":3766,"comment_amount_label":"4","views_label":"3766"},{"id":3541399,"title":"\u201c2017年世界500强\u201d中徽商占两席 王文银成为徽商企业家首富","link":"lsapp://cn.ahurls.news/news?id=3541399","pics":["appletrecommend/201805/5b08a60733c46.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":0,"source":"","type_sign":"","inner_news":1,"views":73,"comment_amount_label":"0","views_label":"73"},{"id":3541302,"title":"5月25日24时安徽油价上调 92号汽油每升上调0.2元","link":"lsapp://cn.ahurls.news/news?id=3541302","pics":["appletrecommend/201805/5b07d930d0ebf.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":11,"source":"","type_sign":"","inner_news":1,"views":3373,"comment_amount_label":"11","views_label":"3373"},{"id":3540446,"title":"【专题】2018世界制造业大会合肥宣言正式发布 全球制造领域有了\u201c合肥声音\u201d","link":"lsapp://cn.ahurls.news/special?id=3540446","pics":["18/0525/5b074ce5c56d4.jpg"],"t":"url","type":"special","alias":"headline","pic_amount":0,"style":"single_fill","comment_amount":2,"source":"","type_sign":"专题","inner_news":1,"views":4582,"comment_amount_label":"2","views_label":"4582","pics_new":["18/0525/5b074ce5c56d4.jpg"]},{"id":3540693,"title":"调查:安徽班主任试喝牛奶确保安全 媒体:缺乏人性温度 你怎么看","link":"lsapp://cn.ahurls.news/news?id=3540693","pics":["appletrecommend/201805/5b073a72cbf8c.jpg"],"t":"url","type":"vote","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"投票","inner_news":1,"views":6024,"comment_amount_label":"4","views_label":"6024","pics_new":["appletrecommend/201805/5b073a72cbf8c.jpg"]},{"id":3541348,"title":"合肥蜀山区一菜市场厕所垃圾桶惊现一名死婴 警方介入调查","link":"lsapp://cn.ahurls.news/news?id=3541348","pics":["appletrecommend/201805/5b07fe759614b.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":3042,"comment_amount_label":"2","views_label":"3042"},{"id":3541039,"title":"这是一个令人振奋的消息! 合肥东部新中心来了","link":"lsapp://cn.ahurls.news/news?id=3541039","pics":["appletrecommend/201805/5b0783c941b0c.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":9,"source":"","type_sign":"","inner_news":1,"views":4000,"comment_amount_label":"9","views_label":"4000"},{"id":3541088,"title":"3岁女童因恶性肿瘤身亡 父母被指拿着捐款治疗儿子兔唇放弃女儿","link":"lsapp://cn.ahurls.news/image_news?id=3541088","pics":["special/tuku/201805/5b07a64e1a47655741.jpg","special/tuku/201805/5b07a64e2679386727.jpg","special/tuku/201805/5b07a64e0739a67091.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2870,"comment_amount_label":"2","views_label":"2870","pics_new":["special/tuku/201805/5b07a64e1a47655741.jpg"]},{"id":3540741,"title":"合肥教育局权威发布!中小学网上报名入学最新最全解答","link":"lsapp://cn.ahurls.news/news?id=3540741","pics":["appletrecommend/201805/5b07530ba7edb.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":5045,"comment_amount_label":"3","views_label":"5045"},{"id":3541009,"title":"合肥市公交换乘细则正式出炉 \u201c带人乘车刷卡\u201d不享受换乘优惠","link":"lsapp://cn.ahurls.news/news?id=3541009","pics":["appletrecommend/201805/5b07795a5df5c.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":5,"source":"","type_sign":"","inner_news":1,"views":4280,"comment_amount_label":"5","views_label":"4280"},{"id":3541029,"title":"今天凌晨合肥一辆白色轿车滑入天鹅湖 事发时车上或有人","link":"lsapp://cn.ahurls.news/news?id=3541029","pics":["appletrecommend/201805/5b077eba55a41.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":12,"source":"","type_sign":"","inner_news":1,"views":8157,"comment_amount_label":"12","views_label":"8157"},{"id":3541232,"title":"【专题】反转!王凤雅重病去世爷爷称善款剩千元 嫣然天使基金提供弟弟治兔唇钱","link":"lsapp://cn.ahurls.news/special?id=3541232","pics":["18/0525/5b07c6738acf1.jpg"],"t":"url","type":"special","alias":"headline","pic_amount":0,"style":"single_fill","comment_amount":1,"source":"","type_sign":"专题","inner_news":1,"views":2011,"comment_amount_label":"1","views_label":"2011","pics_new":["18/0525/5b07c6738acf1.jpg"]},{"id":3540737,"title":"站内何时能充值合肥通?合肥轨道公司回复市民热点问题","link":"lsapp://cn.ahurls.news/news?id=3540737","pics":["appletrecommend/201805/5b073e2513048.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":4,"source":"","type_sign":"","inner_news":1,"views":4351,"comment_amount_label":"4","views_label":"4351"},{"id":3541162,"title":"活久见!男子不满女友登记时\u201c再考虑一下\u201d 一顿拳脚后两人又领证了","link":"lsapp://cn.ahurls.news/news?id=3541162","pics":["appletrecommend/201805/5b07b9a258016.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":7,"source":"","type_sign":"","inner_news":1,"views":3182,"comment_amount_label":"7","views_label":"3182"},{"id":3540754,"title":"今年合肥小学初中网上报名如何登记操作?这份\u201c入学指南\u201d请收好","link":"lsapp://cn.ahurls.news/news?id=3540754","pics":["appletrecommend/201805/5b07532313edd.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":6194,"comment_amount_label":"2","views_label":"6194"},{"id":3541169,"title":"合肥奔驰女不满物业规定 违停\u201c堵门\u201d辱骂殴打保安","link":"lsapp://cn.ahurls.news/image_news?id=3541169","pics":["special/tuku/201805/5b07ba822763455489.jpg","special/tuku/201805/5b07ba825c5e834613.jpg","special/tuku/201805/5b07ba8270df111019.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":6,"source":"","type_sign":"","inner_news":1,"views":1895,"comment_amount_label":"6","views_label":"1895","pics_new":["special/tuku/201805/5b07ba822763455489.jpg"]},{"id":3541308,"title":"流行性腮腺炎进入高发季 合肥疾控中心专家:幼儿需及时接种疫苗","link":"lsapp://cn.ahurls.news/news?id=3541308","pics":["appletrecommend/201805/5b0803117f3c6.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":1963,"comment_amount_label":"3","views_label":"1963"},{"id":3541301,"title":"女子周旋两个丈夫间5年未被发现 花钱雇老夫妻扮演自己父母","link":"lsapp://cn.ahurls.news/news?id=3541301","pics":["appletrecommend/201805/5b0802bce6c69.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":2222,"comment_amount_label":"3","views_label":"2222"},{"id":3541295,"title":"四川男子录抖音视频辱骂河南人后道歉:自己初中文化不了解地域黑","link":"lsapp://cn.ahurls.news/news?id=3541295","pics":["appletrecommend/201805/5b0801bbde00d.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2457,"comment_amount_label":"2","views_label":"2457"},{"id":3541226,"title":"【大碗视频】黑科技!直击2018世界制造业大会:应急情况加色拉油 直升机也能飞","link":"lsapp://cn.ahurls.news/news?id=3541226","pics":["appletrecommend/201805/5b08012ee91f3.jpg"],"t":"url","type":"video","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"视频","inner_news":1,"views":2539,"comment_amount_label":"2","views_label":"2539","pics_new":["appletrecommend/201805/5b08012ee91f3.jpg"]},{"id":3541213,"title":"清华北大公布2018保送生拟录取名单 合肥这两所学校学生上榜","link":"lsapp://cn.ahurls.news/news?id=3541213","pics":["appletrecommend/201805/5b07d21525ca6.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":3586,"comment_amount_label":"3","views_label":"3586"},{"id":3540757,"title":"捂脸!男子婚后压力大扮女装卖淫 嫖客得知真相当场吐了","link":"lsapp://cn.ahurls.news/news?id=3540757","pics":["appletrecommend/201805/5b0751ecf0eda.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":6107,"comment_amount_label":"3","views_label":"6107"},{"id":3541268,"title":"\u201c小猪佩奇\u201d文身贴安全吗? 部分商品无\u201c安全提示\u201d","link":"lsapp://cn.ahurls.news/news?id=3541268","pics":["appletrecommend/201805/5b07d45876402.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":1985,"comment_amount_label":"3","views_label":"1985"},{"id":3540922,"title":"64岁老汉猥亵小学女生:就为找点儿刺激","link":"lsapp://cn.ahurls.news/image_news?id=3540922","pics":["special/tuku/201805/5b076e1c36c8e31616.jpg","special/tuku/201805/5b076e1c5164d76430.jpg","special/tuku/201805/5b076e1c64ed337508.jpg"],"t":"url","type":"images","alias":"headline","pic_amount":3,"style":"multi","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":1986,"comment_amount_label":"2","views_label":"1986","pics_new":["special/tuku/201805/5b076e1c36c8e31616.jpg"]},{"id":3541223,"title":"四川惊现\u201c摔儿老师\u201d:抓小孩的手提起来转圈体罚","link":"lsapp://cn.ahurls.news/news?id=3541223","pics":["appletrecommend/201805/5b07cf20d38d0.jpg"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":2,"source":"","type_sign":"","inner_news":1,"views":2047,"comment_amount_label":"2","views_label":"2047"},{"id":3541214,"title":"大爷替35岁女儿相亲要求有房是公务员:追求稳定的生活","link":"lsapp://cn.ahurls.news/news?id=3541214","pics":["appletrecommend/201805/5b07c4f720f6e.png"],"t":"url","type":"normal","alias":"headline","pic_amount":0,"style":"single_right","comment_amount":3,"source":"","type_sign":"","inner_news":1,"views":2206,"comment_amount_label":"3","views_label":"2206"}] * extras : {"slider":[{"id":3541393,"pic":"18/0526/5b08a55aa0724.jpg","link":"lsapp://cn.ahurls.news/news?id=3541393","t":"url","inner_news":1,"title":"来安徽旅游这5条精品路线不可错过","type":"nomal","type_sign":""},{"id":3540769,"pic":"18/0525/5b07c9c67edab.jpg","link":"lsapp://cn.ahurls.news/news?id=3540769","t":"url","inner_news":1,"title":"合肥构建未成人心理健康\u201c防护网\u201d","type":"nomal","type_sign":""},{"id":3540819,"pic":"18/0525/5b07aaec28743.jpg","link":"lsapp://cn.ahurls.news/news?id=3540819","t":"url","inner_news":1,"title":"数据告诉你\u201c合肥造\u201d到底有多强","type":"nomal","type_sign":""},{"id":3540806,"pic":"18/0525/5b076b21b1432.jpg","link":"lsapp://cn.ahurls.news/news?id=3540806","t":"url","inner_news":1,"title":"解码合肥工业经济跨越之路","type":"nomal","type_sign":""},{"id":3540583,"pic":"18/0524/5b06b8c92b95d.jpg","link":"lsapp://cn.ahurls.news/news?id=3540583","t":"url","inner_news":1,"title":"安徽一季度水质对赌结果出炉","type":"nomal","type_sign":""}]} * bindtips : */ private int page; private int perpage; private int max_page; private int total; private ExtrasBean extras; private String bindtips; private List<DataBean> data; public static DataBeanX objectFromData(String str) { return new Gson().fromJson(str, DataBeanX.class); } public static DataBeanX objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getString(str), DataBeanX.class); } catch (JSONException e) { e.printStackTrace(); } return null; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getPerpage() { return perpage; } public void setPerpage(int perpage) { this.perpage = perpage; } public int getMax_page() { return max_page; } public void setMax_page(int max_page) { this.max_page = max_page; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public ExtrasBean getExtras() { return extras; } public void setExtras(ExtrasBean extras) { this.extras = extras; } public String getBindtips() { return bindtips; } public void setBindtips(String bindtips) { this.bindtips = bindtips; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class ExtrasBean { private List<SliderBean> slider; public static ExtrasBean objectFromData(String str) { return new Gson().fromJson(str, ExtrasBean.class); } public static ExtrasBean objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getString(str), ExtrasBean.class); } catch (JSONException e) { e.printStackTrace(); } return null; } public List<SliderBean> getSlider() { return slider; } public void setSlider(List<SliderBean> slider) { this.slider = slider; } public static class SliderBean { /** * id : 3541393 * pic : 18/0526/5b08a55aa0724.jpg * link : lsapp://cn.ahurls.news/news?id=3541393 * t : url * inner_news : 1 * title : 来安徽旅游这5条精品路线不可错过 * type : nomal * type_sign : */ private int id; private String pic; private String link; private String t; private int inner_news; private String title; private String type; private String type_sign; public static SliderBean objectFromData(String str) { return new Gson().fromJson(str, SliderBean.class); } public static SliderBean objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getString(str), SliderBean.class); } catch (JSONException e) { e.printStackTrace(); } return null; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getT() { return t; } public void setT(String t) { this.t = t; } public int getInner_news() { return inner_news; } public void setInner_news(int inner_news) { this.inner_news = inner_news; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getType_sign() { return type_sign; } public void setType_sign(String type_sign) { this.type_sign = type_sign; } } } public static class DataBean { /** * id : 3541397 * title : 合肥新定位为全国智能家居研发生产中心 四大件产量连续多年居全国之首 * link : lsapp://cn.ahurls.news/news?id=3541397 * pics : ["appletrecommend/201805/5b08a30fa4712.jpg"] * t : url * type : normal * alias : headline * pic_amount : 0 * style : single_right * comment_amount : 0 * source : * type_sign : * inner_news : 1 * views : 162 * comment_amount_label : 0 * views_label : 162 * pics_new : ["appletrecommend/201805/5b08a3fb804d1.jpg"] */ private int id; private String title; private String link; private String t; private String type; private String alias; private int pic_amount; private String style; private int comment_amount; private String source; private String type_sign; private int inner_news; private int views; private String comment_amount_label; private String views_label; private List<String> pics; private List<String> pics_new; public static DataBean objectFromData(String str) { return new Gson().fromJson(str, DataBean.class); } public static DataBean objectFromData(String str, String key) { try { JSONObject jsonObject = new JSONObject(str); return new Gson().fromJson(jsonObject.getString(str), DataBean.class); } catch (JSONException e) { e.printStackTrace(); } return null; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getT() { return t; } public void setT(String t) { this.t = t; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getAlias() { return alias; } public void setAlias(String alias) { this.alias = alias; } public int getPic_amount() { return pic_amount; } public void setPic_amount(int pic_amount) { this.pic_amount = pic_amount; } public String getStyle() { return style; } public void setStyle(String style) { this.style = style; } public int getComment_amount() { return comment_amount; } public void setComment_amount(int comment_amount) { this.comment_amount = comment_amount; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getType_sign() { return type_sign; } public void setType_sign(String type_sign) { this.type_sign = type_sign; } public int getInner_news() { return inner_news; } public void setInner_news(int inner_news) { this.inner_news = inner_news; } public int getViews() { return views; } public void setViews(int views) { this.views = views; } public String getComment_amount_label() { return comment_amount_label; } public void setComment_amount_label(String comment_amount_label) { this.comment_amount_label = comment_amount_label; } public String getViews_label() { return views_label; } public void setViews_label(String views_label) { this.views_label = views_label; } public List<String> getPics() { return pics; } public void setPics(List<String> pics) { this.pics = pics; } public List<String> getPics_new() { return pics_new; } public void setPics_new(List<String> pics_new) { this.pics_new = pics_new; } } } }
DataPresenter
package com.example.yuekaomoni1.p; public interface DataPresenter { void showData(String page); }
然後是我們的MyApp
package com.example.yuekaomoni1; import android.app.Application; import android.os.Environment; import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.assist.QueueProcessingType; import java.io.File; /** * Created by Administrator on 2018/1/3. */ public class Myapplication extends Application { @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(480, 800) .diskCacheExtraOptions(480, 800, null) .tasksProcessingOrder(QueueProcessingType.FIFO) .denyCacheImageMultipleSizesInMemory() .memoryCache(new LRULimitedMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) .build(); ImageLoader.getInstance().init(configuration); } }
這個類是我們的自定義的view
package com.example.yuekaomoni1; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; public class MyViewGroup extends ViewGroup { private int measuredWidth; public MyViewGroup(Context context) { this(context, null); } public MyViewGroup(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measuredWidth = getMeasuredWidth(); //测量子View的宽高,只有Viewgroup中有这个方法 直接继承View没有这个方法 measureChildren(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { //拿到子控件的个数 int childCount = getChildCount(); //定义一个临时变量 高度 int startHeight = 0; int startWidth = 0; //循环遍历每一个View for (int i = 0; i < childCount; i++) { View v = getChildAt(i); //给每一个View设置自己的位置 v.layout(startWidth, startHeight, startWidth + v.getMeasuredWidth(), startHeight + v.getMeasuredHeight()); startHeight += v.getMeasuredHeight(); startWidth += v.getMeasuredWidth(); if (startWidth >= measuredWidth) { startWidth = 0; } } } }
SpacesItemDecoration
package com.example.yuekaomoni1; import android.graphics.Rect; import android.support.v7.widget.RecyclerView; import android.view.View; public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.right = space; outRect.bottom = space; // Add top margin only for the first item to avoid double space between items if (parent.getChildPosition(view) == 0) outRect.top = space; } }
ShopRecyclerAdapter
package com.example.yuekaomoni1; import android.animation.ObjectAnimator; import android.content.Context; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.yuekaomoni1.p.DataBeans; import com.example.yuekaomoni1.p.RecyclerBean; import com.jcodecraeer.xrecyclerview.XRecyclerView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; import java.util.List; import static android.graphics.Typeface.NORMAL; public class ShopRecyclerAdapter extends XRecyclerView.Adapter<XRecyclerView.ViewHolder> { private final static int NORMAL = 1; private final static int IMAGES = 2; private String imageSplice = "http://365jia.cn/uploads/"; private LayoutInflater inflater; Context context; private List<DataBeans.DataBeanX.DataBean> list; public ShopRecyclerAdapter(Context context, List<DataBeans.DataBeanX.DataBean> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } @Override public int getItemViewType(int position) { String type = list.get(position).getType(); if ("images".equals(type)) { return IMAGES; } else { return NORMAL; } } public void setData(List<DataBeans.DataBeanX.DataBean> list) { list.addAll(list); } @NonNull @Override public XRecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder; if (viewType == NORMAL) { View view = inflater.inflate(R.layout.normal_item, parent, false); holder = new NormalViewHolder(view); } else if (viewType == IMAGES) { View view = inflater.inflate(R.layout.images_item, parent, false); holder = new ImagesViewHolder(view); } else { holder = null; } return holder; } @Override public void onBindViewHolder(@NonNull XRecyclerView.ViewHolder holder, final int position) { int itemViewType = getItemViewType(position); DataBeans.DataBeanX.DataBean dataBean = list.get(position); if (itemViewType == NORMAL) { NormalViewHolder normalViewHolder = (NormalViewHolder) holder; normalViewHolder.normal_title.setText(dataBean.getTitle()); Glide.with(context).load(imageSplice + dataBean.getPics().get(0)).into(normalViewHolder.normal_img); normalViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onItemClick(position); } } }); } else if (itemViewType == IMAGES) { ImagesViewHolder imagesViewHolder = (ImagesViewHolder) holder; imagesViewHolder.images_title.setText(dataBean.getTitle()); Glide.with(context).load(imageSplice + dataBean.getPics().get(0)).into(imagesViewHolder.images01); Glide.with(context).load(imageSplice + dataBean.getPics().get(1)).into(imagesViewHolder.images02); Glide.with(context).load(imageSplice + dataBean.getPics().get(2)).into(imagesViewHolder.images03); imagesViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onItemClick(position); } } }); } } @Override public int getItemCount() { return list.size(); } class NormalViewHolder extends RecyclerView.ViewHolder { private final TextView normal_title; private final ImageView normal_img; public NormalViewHolder(final View itemView) { super(itemView); normal_title = itemView.findViewById(R.id.normal_title); normal_img = itemView.findViewById(R.id.normal_img); normal_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onImageClick(v); } } }); } } class ImagesViewHolder extends RecyclerView.ViewHolder { private final ImageView images01; private final ImageView images02; private final ImageView images03; private final TextView images_title; public ImagesViewHolder(View itemView) { super(itemView); images01 = itemView.findViewById(R.id.images01); images02 = itemView.findViewById(R.id.images02); images03 = itemView.findViewById(R.id.images03); images_title = itemView.findViewById(R.id.images_title); images01.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onImageClick(v); } } }); images02.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onImageClick(v); } } }); images03.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClick != null) { mOnItemClick.onImageClick(v); } } }); } } interface OnItemClick { void onImageClick(View view); void onItemClick(int position); } private OnItemClick mOnItemClick; public void setOnItemClick(OnItemClick onItemClick) { this.mOnItemClick = onItemClick; } //删除 public void deleteItem(int poistion) { list.remove(poistion); } }
Main2Activity
package com.example.yuekaomoni1; import android.animation.ObjectAnimator; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.view.View; import android.widget.TextView; import com.example.yuekaomoni1.p.DataBeans; import com.example.yuekaomoni1.p.DataPresenter; import com.example.yuekaomoni1.p.DataPresenterImp; import com.example.yuekaomoni1.p.RecyclerBean; import com.example.yuekaomoni1.v.DataView; import com.example.yuekaomoni1.v.IDataView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.List; public class Main2Activity extends AppCompatActivity implements DataView { private XRecyclerView mrecycleview; private DataPresenterImp dataPresenterImp; private List<DataBeans.DataBeanX.DataBean> list; private ShopRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initview(); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mrecycleview.setLayoutManager(linearLayoutManager); dataPresenterImp = new DataPresenterImp(this); dataPresenterImp.showData("1"); } private void initview() { mrecycleview = findViewById(R.id.xrv); } @Override public void showData(List<DataBeans.DataBeanX.DataBean> list) { adapter = new ShopRecyclerAdapter(this, list); mrecycleview.addItemDecoration(new SpacesItemDecoration(10)); mrecycleview.setAdapter(adapter); adapter.setOnItemClick(new ShopRecyclerAdapter.OnItemClick() { @Override public void onImageClick(View view) { ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", new float[]{1f, 0.5f, 0.0f, 0.5f, 1.0f}); alpha.setRepeatMode(ObjectAnimator.RESTART); alpha.setDuration(2000); alpha.setRepeatCount(0); alpha.start(); } @Override public void onItemClick(int position) { //弹出框 showAlertDialog(position); } }); } private void showAlertDialog(final int position) { AlertDialog.Builder builder = new AlertDialog.Builder(Main2Activity.this); builder.setTitle("提示:"); builder.setMessage("请问你要删除吗?"); builder.setIcon(R.mipmap.ic_launcher_round); //点击对话框以外的区域是否让对话框消失 builder.setCancelable(false); //设置正面按钮 builder.setPositiveButton("是的", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { adapter.deleteItem(position); adapter.notifyDataSetChanged(); dialog.dismiss(); } }); //设置反面按钮 builder.setNegativeButton("不是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.show(); } @Override protected void onDestroy() { super.onDestroy(); dataPresenterImp.cloneView(); } }
剩下的就是我們的子佈局文件了
<?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="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/normal_img" android:layout_width="80dp" android:layout_height="80dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="3" android:orientation="vertical"> <TextView android:id="@+id/normal_title" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:text="ggggggggggggg" android:textSize="25sp" /> <TextView android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="right" android:layout_weight="1" android:gravity="center" android:text="1256评论 120赞" android:textSize="25sp" /> </LinearLayout> </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="match_parent" android:orientation="vertical"> <TextView android:id="@+id/images_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="ffffffffffffffff" android:textSize="25sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:orientation="horizontal"> <ImageView android:id="@+id/images01" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:src="@mipmap/ic_launcher" /> <ImageView android:id="@+id/images02" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:src="@mipmap/ic_launcher" /> <ImageView android:id="@+id/images03" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:src="@mipmap/ic_launcher" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1256评论 120赞" android:textSize="25sp" /> </LinearLayout>
依赖
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' implementation 'com.github.bumptech.glide:glide:4.7.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1' implementation 'com.google.code.gson:gson:2.2.4' compile 'com.jcodecraeer:xrecyclerview:1.5.9' implementation 'com.android.support:design:27.1.1' implementation 'com.squareup.okhttp:okhttp:2.0.0' }