XListView實現(xiàn)網(wǎng)絡(luò)加載圖片和下拉刷新
更新時間:2018年11月23日 14:48:45 作者:FanRQ_
這篇文章主要為大家詳細介紹了XListView實現(xiàn)網(wǎng)絡(luò)加載圖片和下拉刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了XListView實現(xiàn)網(wǎng)絡(luò)加載圖片,和下拉刷新的功能,供大家參考,具體內(nèi)容如下
MainActivity.java
public class MainActivity extends AppCompatActivity {
private XListView contents;
private int page = 0;
private MyBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contents = findViewById(R.id.contents);
adapter = new MyBaseAdapter(getLayoutInflater());
contents.setAdapter(adapter);
//是否開啟下拉刷新 上拉加載
//contents.setPullRefreshEnable(false);
contents.setPullLoadEnable(true);
contents.setXListViewListener(new XListView.IXListViewListener() {
@Override public void onRefresh() {
page = 0;
loadData(page);
//加載刷新數(shù)據(jù)
}
@Override public void onLoadMore() {
loadData(page);
}
});
//一進來就去加載第一頁數(shù)據(jù)
loadData(page);
}
private String url =
"http://apis.juhe.cn/cook/query?key=3ec004200a6a2f4cf4774e480c006375&menu=%E8%A5%BF%E7%BA%A2%E6%9F%BF&rn=10&pn=";
private void loadData(int page) {
String requestUrlWithPageNum = url + page;
//加載網(wǎng)絡(luò)數(shù)據(jù)
new AsyncTask<String, Void, List<DataItem>>() {
@Override protected List<DataItem> doInBackground(String... strings) {
ResponseBean responseBean = null;
try {
URL url = new URL(strings[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200) {
String str = stream2String(urlConnection.getInputStream());
responseBean = new Gson().fromJson(str, ResponseBean.class);
} else {
//
}
return responseBean == null ? null : responseBean.getResult().getData();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override protected void onPostExecute(List<DataItem> dataItems) {
if (dataItems == null) {
Toast.makeText(MainActivity.this, "請求數(shù)據(jù)錯誤", Toast.LENGTH_LONG).show();
return;
}
//更新數(shù)據(jù)
updateData(dataItems);
loadCompleted();
}
}.execute(url);
}
private String stream2String(InputStream is) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) {
sb.append(tmp);
}
return sb.toString();
}
private void updateData(List<DataItem> datas) {
if (page == 0) {
adapter.setDatas(datas);
} else {
adapter.addDatas(datas);
}
}
//通過 加載 / 刷新 完成
private void loadCompleted() {
//通過ListView:刷新、加載完成
page++;
contents.stopLoadMore();
contents.stopRefresh();
}
}
MyBaseAdapter.java
public class MyBaseAdapter extends BaseAdapter {
private List<DataItem> mDatas;
protected LayoutInflater mInflater;
/**
* 更新數(shù)據(jù)
*/
public void setDatas(List<DataItem> datas) {
mDatas.clear();
if (datas != null) {
mDatas.addAll(datas);
}
notifyDataSetChanged();
}
/**
* 追加數(shù)據(jù)
*/
public void addDatas(List<DataItem> datas) {
if (datas != null) {
mDatas.addAll(datas);
notifyDataSetChanged();
}
}
public MyBaseAdapter(LayoutInflater mInflater) {
this.mInflater = mInflater;
mDatas = new ArrayList<>();
}
@Override public int getCount() {
return mDatas.size();
}
@Override public DataItem getItem(int position) {
return mDatas.get(position);
}
@Override public long getItemId(int position) {
return position;
}
@Override public View getView(int position, View convertView, ViewGroup parent) {
BaseViewHolder viewHolder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, parent, false);
viewHolder = new BaseViewHolder(convertView);
} else {
viewHolder = (BaseViewHolder) convertView.getTag();
}
viewHolder.bindData(getItem(position));
return convertView;
}
public class BaseViewHolder {
private View itemView;
private ImageView icon;
private TextView title;
private TextView date;
public BaseViewHolder(View itemView) {
this.itemView = itemView;
title = itemView.findViewById(R.id.title);
date = itemView.findViewById(R.id.date);
icon = itemView.findViewById(R.id.icon);
itemView.setTag(this);
}
public void bindData(DataItem dataItem) {
title.setText(dataItem.getTitle());
date.setText(dataItem.getId());
ImageLoader.getInstance().displayImage(dataItem.getFirstImageUrl(), icon,
ImageLoaderConfigs.getDefaultDisplayImageOptions(icon.getContext()));
}
}
}
ImageLoader.java
public class ImageLoaderConfigs {
public static ImageLoaderConfiguration getImageLoaderConfiguration(Context context) {
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
//內(nèi)在緩存額外選項, 最大的寬度,高度
//.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 內(nèi)存緩存文件的最大長寬
//.diskCacheExtraOptions(480, 800, null) // 本地緩存的詳細信息(緩存的最大長寬),最好不要設(shè)置這個
//線程池配置
//.taskExecutor()
//.taskExecutorForCachedImages()
//.threadPoolSize(3) // default 線程池內(nèi)加載的數(shù)量
//.threadPriority(Thread.NORM_PRIORITY - 2) // default 設(shè)置當前線程的優(yōu)先級
//任務(wù)處理優(yōu)先級 Fist In Fist Out
//.tasksProcessingOrder(QueueProcessingType.FIFO) // default
//內(nèi)存中不緩存一張圖片的多個尺寸大小
//.denyCacheImageMultipleSizesInMemory()
//內(nèi)在緩存策略
//.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通過自己的內(nèi)存緩存實現(xiàn)
//內(nèi)存緩存大小
//.memoryCacheSize(2 * 1024 * 1024) // 內(nèi)存緩存的最大值
//內(nèi)在緩存大小:占用百分比
.memoryCacheSizePercentage(13) // default
//磁盤緩存策略
//.diskCache(new LruDiskCache()) // default 可以自定義緩存路徑
//磁盤緩存大小
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)緩存的最大值
//.diskCacheFileCount(100) // 可以緩存的文件數(shù)量
// default為使用HASHCODE對UIL進行加密命名, 還可以用MD5(new Md5FileNameGenerator())加密
//.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
//.imageDownloader(new BaseImageDownloader(context)) // default
//(new BaseImageDecoder(false)) // default
//加載具體圖片時的一些配置
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 打印debug log
.build();
return configuration;
}
public static DisplayImageOptions getDefaultDisplayImageOptions(Context context) {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
//是否緩存
.cacheInMemory(true)
.cacheOnDisk(true)
//RGB 565 r紅色占5 g綠色占6 b藍色占5 -> 2字節(jié)
//alpha
//ARGB 4444 4 4 4 4 -> 2字節(jié)
//ARGB 8888 -> 4字節(jié)
//10 * 10 用rgb565 -> 10*10*2
.bitmapConfig(Bitmap.Config.RGB_565)
//加載時、加載錯誤時展示什么內(nèi)容
.showImageOnLoading(R.mipmap.ic_launcher)
.showImageOnFail(R.mipmap.ic_launcher)
//
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
//加載效果
//ctrl + p
.displayer(new CircleBitmapDisplayer())
.build();
//ctrl + h
//BitmapDisplayer;
return displayImageOptions;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中ActionBar以及menu的代碼設(shè)置樣式
這篇文章主要介紹了Android中ActionBar以及menu的代碼設(shè)置樣式的相關(guān)資料,需要的朋友可以參考下2015-07-07
Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例
本篇文章主要介紹了Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例,具有一定的參考價值,有需要的可以了解一下。2016-12-12
Kotlin?coroutineContext源碼層深入分析
表示一個元素或者是元素集合的接口。它有一個Key(索引)的Element實例集合,每一個Element的實例也是一個CoroutineContext,即集合中每個元素也是集合2022-11-11
Android自定義狀態(tài)欄顏色與APP風格保持一致的實現(xiàn)方法
我們知道iOS上的應用,狀態(tài)欄的顏色總能與應用標題欄顏色保持一致,用戶體驗很不錯,那安卓是否可以呢?下面小編給大家?guī)砹薃ndroid自定義狀態(tài)欄顏色與APP風格保持一致的實現(xiàn)方法,跟著小編一起學習吧2016-10-10

