Viewpager無限輪播+XlistView
阿新 • • 發佈:2018-11-19
前提
寫許可權 <uses-permission android:name="android.permission.INTERNET"/>
寫name屬性 android:name=".App"
寫依賴 或導xlistview module
NewsBean
public class NewsBean { /** * result : [{"followMovie":false,"id":20,"imageUrl":"http://172.17.8.100/images/movie/stills/ws/ws1.jpg","name":"無雙","rank":1,"summary":"以代號\u201c畫家\u201d(周潤發 飾)為首的犯罪團伙,掌握了製造偽鈔技術,難辨真偽,並在全球進行交易獲取利益,引起警方高度重視。然而\u201c畫家\u201d和其他成員的身份一直成謎,警方的破案進度遭受到了前所未有的挑戰。在關鍵時刻,擅長繪畫的李問(郭富城 飾)打開了破案的突破口,而\u201c畫家\u201d的真實身份卻讓眾人意想不到\u2026\u2026"},{"followMovie":false,"id":19,"imageUrl":"http://172.17.8.100/images/movie/stills/jhen/jhen1.jpg","name":"江湖兒女","rank":2,"summary":"故事起始於2001年的山西大同,模特巧巧(趙濤 飾)與計程車公司老闆斌哥(廖凡 飾)是一對戀人,斌哥每天在外面呼朋喚友,巧巧卻希望兩人能夠儘快步入婚姻的殿堂。然而一次斌哥在街頭遭到競爭對手的襲擊,巧巧為了保護斌哥在街頭開槍,被判刑五年。巧巧出獄以後,開始尋找斌哥以便重新開始,然而事情卻發生了意想不到的變化。"},{"followMovie":false,"id":16,"imageUrl":"http://172.17.8.100/images/movie/stills/dzd6qmwj/dzd6qmwj1.jpg","name":"碟中諜6:全面瓦解","rank":3,"summary":"有時好意會造成惡果,人反而被自己所造成的結果所困擾。伊桑·亨特(湯姆·克魯斯 飾)和他的IMF團隊(亞歷克·鮑德溫、西蒙·佩吉、文·瑞姆斯)將在最新的電影《碟中諜6:全面瓦解》中再度迴歸,他們會與觀眾們熟悉的盟友(麗貝卡·弗格森、米歇爾·莫娜漢)一起與時間賽跑,應對一次任務中出現的意外。亨利·卡維爾、安吉拉·貝塞特和凡妮莎·柯比也將加入本片的演員陣容,電影製片人克里斯托夫·邁考利將會再度擔任導演。"},{"followMovie":false,"id":17,"imageUrl":"http://172.17.8.100/images/movie/stills/ftfb3/ftfb(3)1.jpg","name":"反貪風暴3","rank":4,"summary":"ICAC (廉政公署) 陸志廉(古天樂 飾),JFIU (聯合財富情報組) 劉保強(張智霖 飾)分別偵查貪汙及洗黑錢案,但苦無線索,這時廉政公署L組 (內部紀律調查組) 程德明(鄭嘉穎 飾)收到舉報,指陸志廉收賄1200萬,陸無法辯解實時停職。劉發現陸被誣陷,並跟一直調查的洗黑錢案有著千絲萬縷關係,同時懷疑銀行主任遊子新(栢天男 飾)協助罪惡集團洗黑錢;陸冒險蒐集罪證卻遭禁錮,命懸一線......."},{"followMovie":false,"id":18,"imageUrl":"http://172.17.8.100/images/movie/stills/hjxd/hjxd1.jpg","name":"黃金兄弟","rank":5,"summary":"獅王(鄭伊健 飾)、火山(陳小春 飾)、Bill(謝天華 飾)、淡定(錢嘉樂 飾)、老鼠(林曉峰 飾)五個出生入死的兄弟,在恩師曹sir(曾志偉 飾)的帶領下,為了救濟兒童而偷取特效藥,卻慘遭設局,陷入槍林彈雨的險境之中。兄弟們抱著視死如歸的豪情,展開一連串的追查與激戰。他們明白,即使無法活著回來,也比一人活著痛快!"},{"followMovie":false,"id":21,"imageUrl":"http://172.17.8.100/images/movie/stills/zdn/zdn1.jpg","name":"找到你","rank":6,"summary":"律師李捷(姚晨 飾)正在離婚進行時,與前夫爭奪女兒撫養權,拼命工作為給孩子最好的生活,幸有保姆孫芳(馬伊琍 飾)幫忙照顧孩子視如己出。一日下班,李捷發現保姆孫芳和女兒毫無預兆地消失了,她內心最大的恐懼變成了現實。在追尋孫芳和女兒的下落時,她收到來自家人的譴責聲討,甚至遭到警方的懷疑。幾乎崩潰的李捷,靠著驚人的勇氣,踏上獨自尋訪的旅程。在追蹤過程中,李捷逐漸接近了另一個女人\u2014\u2014保姆孫芳的人生故事,她的身份原先都是謊言,而真相也將浮出水面\u2026\u2026"}] * message : 查詢成功 * status : 0000 */ private String message; private String status; private List<ResultBean> result; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public List<ResultBean> getResult() { return result; } public void setResult(List<ResultBean> result) { this.result = result; } public static class ResultBean { /** * followMovie : false * id : 20 * imageUrl : http://172.17.8.100/images/movie/stills/ws/ws1.jpg * name : 無雙 * rank : 1 * summary : 以代號“畫家”(周潤發 飾)為首的犯罪團伙,掌握了製造偽鈔技術,難辨真偽,並在全球進行交易獲取利益,引起警方高度重視。然而“畫家”和其他成員的身份一直成謎,警方的破案進度遭受到了前所未有的挑戰。在關鍵時刻,擅長繪畫的李問(郭富城 飾)打開了破案的突破口,而“畫家”的真實身份卻讓眾人意想不到…… */ private boolean followMovie; private int id; private String imageUrl; private String name; private int rank; private String summary; public boolean isFollowMovie() { return followMovie; } public void setFollowMovie(boolean followMovie) { this.followMovie = followMovie; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } } }
PagerBean
public class PagerBean { /** * msg : * code : 0 * data : [{"aid":1,"createtime":"2017-12-26T21:49:44","icon":"https://www.zhaoapi.cn/images/quarter/ad1.png","productId":null,"title":"第十三界瑞麗模特大賽","type":0,"url":"http://m.mv14449315.icoc.bz/index.jsp"},{"aid":2,"createtime":"2017-12-26T21:49:44","icon":"https://www.zhaoapi.cn/images/quarter/ad2.png","productId":null,"title":"文化藝術節","type":0,"url":"http://m.mv14449315.icoc.bz/index.jsp"},{"aid":3,"createtime":"2017-12-26T21:49:44","icon":"https://www.zhaoapi.cn/images/quarter/ad3.png","productId":null,"title":"直播封面標準","type":0,"url":"http://m.mv14449315.icoc.bz/index.jsp"},{"aid":4,"createtime":"2017-12-26T21:49:44","icon":"https://www.zhaoapi.cn/images/quarter/ad4.png","productId":"1","title":"人氣誰最高,金主誰最豪氣","type":1,"url":""}] */ private String msg; private String code; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * aid : 1 * createtime : 2017-12-26T21:49:44 * icon : https://www.zhaoapi.cn/images/quarter/ad1.png * productId : null * title : 第十三界瑞麗模特大賽 * type : 0 * url : http://m.mv14449315.icoc.bz/index.jsp */ private int aid; private String createtime; private String icon; private Object productId; private String title; private int type; private String url; public String getIconNoHttps() { return icon.replace("https", "http"); } public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Object getProductId() { return productId; } public void setProductId(Object productId) { this.productId = productId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
NetUtil
public class NetUtil { private static NetUtil netUtil; public NetUtil(){ } public static NetUtil getIntance(){ if(netUtil==null){ netUtil=new NetUtil(); } return netUtil; } public interface CallBack<T>{ void onsuccess(T t); } @SuppressLint("StaticFieldLeak") public void requestData(String strurl, final Class clazz, final CallBack callback){ new AsyncTask<String, Void, Object>() { @Override protected Object doInBackground(String... strings) { return requestData(strings[0],clazz); } @Override protected void onPostExecute(Object o) { callback.onsuccess(o); } }.execute(strurl); } public <T> T requestData(String str,Class cals){ return (T) new Gson().fromJson(requestData(str),cals); } public String requestData(String str){ try { URL url = new URL(str); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(5000); urlConnection.setReadTimeout(5000); int responseCode = urlConnection.getResponseCode(); if(responseCode==200){ String s = streamTostring(urlConnection.getInputStream()); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public String streamTostring(InputStream inputStream) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder builder=new StringBuilder(); for (String tmp=bufferedReader.readLine();tmp!=null;tmp=bufferedReader.readLine()){ builder.append(tmp); } return builder.toString(); } }
App
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoader.getInstance().init(
new ImageLoaderConfiguration.Builder(this)
.diskCacheSize(50*1024*1024)
.memoryCacheSizePercentage(10)
.defaultDisplayImageOptions(new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.showImageForEmptyUri(R.mipmap.ic_launcher)
.showImageOnFail(R.mipmap.ic_launcher)
.showImageOnLoading(R.mipmap.ic_launcher)
.displayer(new RoundedBitmapDisplayer(8))
.build()
)
.build()
);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private XListView xListView;
private String vString="http://www.zhaoapi.cn/quarter/getAd";
private String xString="http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=10&page=";
private int i=1;
private ContentsAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xListView=findViewById(R.id.xlistview);
adapter = new ContentsAdapter(this);
xListView.setAdapter(adapter);
xListView.setPullLoadEnable(true);
xListView.setPullRefreshEnable(true);
xListView.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
i=1;
load();
}
@Override
public void onLoadMore() {
i++;
load();
}
});
load();
}
public void load(){
if(i==1){
loadDates();
loadDate();
}else{
loadDate();
}
}
public void loadDates(){
NetUtil.getIntance().requestData(vString,PagerBean.class, new NetUtil.CallBack<PagerBean>() {
@Override
public void onsuccess(PagerBean pagerBean) {
adapter.setVlist(pagerBean.getData());
}
});
}
public void loadDate(){
NetUtil.getIntance().requestData(xString+i,NewsBean.class, new NetUtil.CallBack<NewsBean>() {
@Override
public void onsuccess(NewsBean newsBean) {
if(i==1){
adapter.setXlist(newsBean.getResult());
}else{
adapter.setXlists(newsBean.getResult());
}
xListView.stopRefresh();
xListView.stopLoadMore();
if(newsBean.getResult().size()<10){
xListView.setPullLoadEnable(false);
}
}
});
}
}
ContentsAdapter
public class ContentsAdapter extends BaseAdapter {
private List<NewsBean.ResultBean> xlist;
private List<PagerBean.DataBean> vlist;
private Context context;
private final int PAGE_TYPE=0;
private final int XLIST_TYPE=1;
private final int TYPE_COUNT=2;
private android.os.Handler mHandler = new android.os.Handler(){
@Override
public void handleMessage(Message msg) {
pholder.viewPager.setCurrentItem(pholder.viewPager.getCurrentItem() + 1);
mHandler.sendEmptyMessageDelayed(0, 2000);
}
};
private PViewHolder pholder;
public ContentsAdapter(Context context) {
this.context = context;
xlist=new ArrayList<>();
vlist=new ArrayList<>();
}
public void setXlist(List<NewsBean.ResultBean> mxlist) {
xlist.clear();
xlist.addAll(mxlist);
notifyDataSetChanged();
}
public void setXlists(List<NewsBean.ResultBean> mxlist) {
xlist.addAll(mxlist);
notifyDataSetChanged();
}
public void setVlist(List<PagerBean.DataBean> mvlist) {
vlist.clear();
vlist.addAll(mvlist);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return position==0&&hasVlit()?PAGE_TYPE:XLIST_TYPE;
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
public boolean hasVlit(){
return vlist.size()>0;
}
@Override
public int getCount() {
return hasVlit()?xlist.size()+1:xlist.size();
}
@Override
public NewsBean.ResultBean getItem(int position) {
return xlist.get(hasVlit()?position-1:position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(getItemViewType(position)==PAGE_TYPE){
if(convertView==null){
pholder =new PViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.viewpager_item,parent,false);
pholder.viewPager=convertView.findViewById(R.id.viewpager);
convertView.setTag(pholder);
}else{
pholder = (PViewHolder) convertView.getTag();
}
mHandler.removeCallbacksAndMessages(null);
pholder.viewPager.setAdapter(new BannerPagerAdapter(vlist,context));
mHandler.sendEmptyMessageDelayed(0,2000);
}else{
XViewHolder xholder;
if(convertView==null){
xholder=new XViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.xlistview_item,parent,false);
xholder.image=convertView.findViewById(R.id.image);
xholder.intro=convertView.findViewById(R.id.intro);
xholder.name=convertView.findViewById(R.id.name);
convertView.setTag(xholder);
}else{
xholder= (XViewHolder) convertView.getTag();
}
xholder.name.setText(getItem(position).getName());
xholder.intro.setText(getItem(position).getSummary());
ImageLoader.getInstance().displayImage(getItem(position).getImageUrl(),xholder.image);
}
return convertView;
}
class XViewHolder{
TextView name,intro;
ImageView image;
}
class PViewHolder{
ViewPager viewPager;
}
}
BannerPagerAdapter
public class BannerPagerAdapter extends PagerAdapter {
private List<PagerBean.DataBean> plist;
private Context context;
public BannerPagerAdapter(List<PagerBean.DataBean> plist, Context context) {
this.plist = plist;
this.context = context;
}
@Override
public int getCount() {
return 5000;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view==o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView imageView=new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
container.addView(imageView);
ImageLoader.getInstance().displayImage(plist.get(position % plist.size()).getIconNoHttps(), imageView, null, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
return imageView;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
layout_main.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"
tools:context=".ui.MainActivity">
<me.maxwin.view.XListView
android:id="@+id/xlistview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</android.support.constraint.ConstraintLayout>
viewpager_item
<?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"
tools:context=".ui.MainActivity">
<me.maxwin.view.XListView
android:id="@+id/xlistview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</android.support.constraint.ConstraintLayout>
xlistview_item
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/image"
app:layout_constraintBottom_toTopOf="@+id/intro"
/>
<TextView
android:id="@+id/intro"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/image"
app:layout_constraintBottom_toBottomOf="parent"
/>
<ImageView
android:id="@+id/image"
android:layout_width="50dp"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/name"
app:layout_constraintBottom_toBottomOf="parent"
/>
</android.support.constraint.ConstraintLayout>