Xlistview上拉重新整理下拉載入+listview多條目無限輪播
阿新 • • 發佈:2018-11-22
1.MainActivity頁面
package com.example.week2_01; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import com.example.Util.NetUtil; import com.example.bean.BunnerBean; import com.example.bean.NewsBean; import me.maxwin.view.XListView; public class MainActivity extends AppCompatActivity { private String bannerUrl="http://www.zhaoapi.cn/quarter/getAd"; private String newUrl = "http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=%d&page=%d"; private int mPage; private XListView xListView; private CountAdaper mAdaper; private final int LOAD_COUNT = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPage = 1; //獲取資源id xListView = findViewById(R.id.xlistview); //建立介面卡 mAdaper = new CountAdaper(this); xListView.setAdapter(mAdaper); //點選監聽 xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //跳轉 Intent intent = new Intent(MainActivity.this,LoginActivity.class); //獲取值 String name = mAdaper.getItem(position-1).getName(); String summary = mAdaper.getItem(position-1).getSummary(); //傳值 intent.putExtra("name",name); intent.putExtra("summary",summary); //執行 startActivity(intent); } }); //設定支援載入 xListView.setPullLoadEnable(true); //設定支援重新整理 xListView.setPullRefreshEnable(true); //xlistview重新整理監聽 xListView.setXListViewListener(new XListView.IXListViewListener() { //重新整理 @Override public void onRefresh() { mPage = 1; //載入資料的方法 loadData(); } //載入 @Override public void onLoadMore() { mPage++; //載入資料的方法 loadData(); } }); loadData(); } //載入資料的方法 private void loadData() { if(mPage == 1){ //載入banner的方法 loadBunnerData(); //載入新聞的方法 loadNewData(); }else{ //載入新聞的方法 loadNewData(); } } private void loadNewData() { NetUtil.getInstance().getResult(String.format(newUrl, LOAD_COUNT, mPage), NewsBean.class, new NetUtil.CallBack<NewsBean>() { @Override public void onSuccess(NewsBean o) { if(mPage == 1){ //重新整理 mAdaper.setmResult(o.getResult()); }else{ //載入 mAdaper.addResult(o.getResult()); } //停止重新整理 xListView.stopRefresh(); //停止載入 xListView.stopLoadMore(); //判斷集合長度小於資料長度停止重新整理 if(o.getResult().size()<LOAD_COUNT){ xListView.setPullLoadEnable(false); } } }); } private void loadBunnerData() { NetUtil.getInstance().getResult(bannerUrl, BunnerBean.class, new NetUtil.CallBack<BunnerBean>() { @Override public void onSuccess(BunnerBean o) { mAdaper.setmBanner(o.getData()); } }); } }
2.展示資料介面卡
package com.example.week2_01; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.bean.BunnerBean; import com.example.bean.NewsBean; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; import java.util.List; public class CountAdaper extends BaseAdapter { private List<BunnerBean.DataBean> mBanner; private List<NewsBean.ResultBean> mResult; private Context mContext; private final int ITEM_COUNT = 2; private final int ITEM_NEW = 0; private final int ITEM_BUNNER = 1; public CountAdaper(Context mContext) { this.mContext = mContext; //初始化 mBanner = new ArrayList<>(); mResult = new ArrayList<>(); } //是否有banner public boolean hasBanner(){ //返回長度大於0有bunner return mBanner.size()>0; } //更新banner public void setmBanner(List<BunnerBean.DataBean> banners){ //清除資料 mBanner.clear(); if(banners!=null){ //新增資料 mBanner.addAll(banners); } //重新整理介面卡 notifyDataSetChanged(); } //更新新聞資料下拉重新整理 public void setmResult(List<NewsBean.ResultBean> results){ //清除資料 mResult.clear(); if(results!=null){ //新增資料 mResult.addAll(results); } //重新整理介面卡 notifyDataSetChanged(); } //追加新聞資料上拉載入 public void addResult(List<NewsBean.ResultBean> results){ if(results!=null){ //新增重新整理的資料 mResult.addAll(results); } //重新整理介面卡 notifyDataSetChanged(); } @Override public int getCount() { return hasBanner()?mResult.size()+1:mResult.size(); } @Override public NewsBean.ResultBean getItem(int position) { return mResult.get(hasBanner()?position-1:position); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return ITEM_COUNT; } @Override public int getItemViewType(int position) { return position == 0 && hasBanner()?ITEM_BUNNER:ITEM_NEW; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(getItemViewType(position) == ITEM_BUNNER) { BunnerViewHolder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.bunneritem,parent,false); holder = new BunnerViewHolder(convertView); }else{ holder = (BunnerViewHolder) convertView.getTag(); } holder.bindBunner(mContext,mBanner); }else{ NewViewHolder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.newsitem,parent,false); holder = new NewViewHolder(convertView); }else{ holder = (NewViewHolder) convertView.getTag(); } holder.bindResult(getItem(position)); } return convertView; } //建立暫存器BunnerViewHolder class BunnerViewHolder{ ViewPager viewPager; @SuppressLint("HandlerLeak") //建立Handler private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { viewPager.setCurrentItem(viewPager.getCurrentItem()+1); handler.sendEmptyMessageDelayed(0,2000); } }; //獲取資源id public BunnerViewHolder(View convertView) { viewPager = convertView.findViewById(R.id.viewpage); convertView.setTag(this); } //賦值 public void bindBunner(Context context ,List<BunnerBean.DataBean> mBanner) { //先取消掉切換任務 handler.removeCallbacksAndMessages(null); //將介面卡設定給viewPager viewPager.setAdapter(new BunnerAdaper(mBanner,context)); //讓ViewPager位於中間 viewPager.setCurrentItem(viewPager.getAdapter().getCount()/2); //開始輪播 handler.sendEmptyMessageDelayed(0,2000); } } //建立暫存器NewViewHolder class NewViewHolder{ ImageView image; TextView name,summary; //獲取資源id public NewViewHolder(View convertView) { image = convertView.findViewById(R.id.image); name = convertView.findViewById(R.id.name); summary = convertView.findViewById(R.id.summary); //設定tag convertView.setTag(this); } //賦值 public void bindResult(NewsBean.ResultBean item) { name.setText(item.getName()); summary.setText(item.getSummary()); //設定圖片 ImageLoader.getInstance().displayImage(item.getImageUrl(),image); } } }
3.輪播圖介面卡
package com.example.week2_01; import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.example.bean.BunnerBean; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; public class BunnerAdaper extends PagerAdapter { private List<BunnerBean.DataBean> mData; private Context mContext; public BunnerAdaper(List<BunnerBean.DataBean> mData, Context mContext) { this.mData = mData; this.mContext = mContext; } @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 imageView = new ImageView(mContext); //設定可拉伸 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //將imageview設定給ViewGroup container.addView(imageView); //設定圖片 ImageLoader.getInstance().displayImage(mData.get(position%mData.size()).getIconNoHttps(),imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { //刪除 container.removeView((View) object); } }
4.新聞Bean
package com.example.bean;
import java.util.List;
public class NewsBean {
private List<ResultBean> result;
public List<ResultBean> getResult() {
return result;
}
public void setResult(List<ResultBean> result) {
this.result = result;
}
public static class ResultBean {
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;
}
}
}
5.輪播圖Bean
package com.example.bean;
import java.util.List;
public class BunnerBean {
private List<DataBean> data;
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private int aid;
private String createtime;
private String icon;
private Object productId;
private String title;
private int type;
private String url;
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 String getIconNoHttps(){
return icon.replace("https","http");
}
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;
}
}
}
6.工具類
package com.example.Util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class NetUtil {
private static NetUtil instance;
private Gson gson;
//私有構造
private NetUtil(){
gson = new Gson();
}
//定義方法,獲取物件
public static NetUtil getInstance() {
if(instance == null){
instance = new NetUtil();
}
return instance;
}
//執行一個網路請求 返回string
public String getResult(String urlStr){
String result = "";
try {
//定義url地址
URL url = new URL(urlStr);
//開啟連線
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//設定超時
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
//獲取請求碼
int responseCode = urlConnection.getResponseCode();
if(responseCode == 200){
result = stream2String(urlConnection.getInputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//將位元組流轉換為字元流
private String stream2String(InputStream inputStream) throws IOException {
StringBuilder builder = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
for (String tmp = br.readLine();tmp!=null;tmp=br.readLine()){
builder.append(tmp);
}
return builder.toString();
}
//解析json返回Bean
public <E> E getResult(String urlStr,Class clazz){
String result = getResult(urlStr);
E e = (E) gson.fromJson(result,clazz);
return e;
}
//定義一個介面
public interface CallBack<E>{
void onSuccess(E e);
}
//回撥呼叫
@SuppressLint("StaticFieldLeak")
public void getResult(String urlStr, final Class clazz, final CallBack callBack){
new AsyncTask<String,Void,Object>(){
@Override
protected Object doInBackground(String... strings) {
return getResult(strings[0],clazz);
}
@Override
protected void onPostExecute(Object o) {
callBack.onSuccess(o);
}
}.execute(urlStr);
}
//判斷網路是否可用
public boolean hasNetWork(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
return activeNetworkInfo!=null&&activeNetworkInfo.isAvailable();
}
}
7.Application初始化圖片
package com.example;
import android.app.Application;
import android.graphics.Bitmap;
import com.example.week2_01.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(this)
//指sdcard的快取大小
.diskCacheSize(50*1204*1204)
//設定記憶體快取數量
.memoryCacheSizePercentage(13)
//設定圖片格式
.defaultDisplayImageOptions(new DisplayImageOptions.Builder()
//啟用外存快取
.cacheOnDisk(true)
//啟用記憶體快取
.cacheInMemory(true)
//設定色彩模式
.bitmapConfig(Bitmap.Config.ARGB_4444)
//設定圖片Uri為空或是錯誤的時候顯示的圖片
.showImageForEmptyUri(R.mipmap.ic_launcher)
//設定圖片載入/解碼過程中錯誤時候顯示的圖片
.showImageOnFail(R.mipmap.ic_launcher)
//設定圖片在下載期間顯示的圖片
.showImageOnLoading(R.mipmap.ic_launcher)
//設定圖片格式
.displayer(new RoundedBitmapDisplayer(16))
.build())
.build());
}
}
8.跳轉展示詳情的Activity
package com.example.week2_01;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class LoginActivity extends AppCompatActivity {
private TextView name;
private TextView summary;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//獲取資源id
name = findViewById(R.id.text_name);
summary = findViewById(R.id.text_summary);
//接收值
Intent intent = getIntent();
name.setText(intent.getStringExtra("name"));
summary.setText(intent.getStringExtra("summary"));
}
}
9AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.week2_01">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name="com.example.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity"/>
</application>
</manifest>