XListView實(shí)現(xiàn)網(wǎng)絡(luò)加載圖片和下拉刷新
本文實(shí)例為大家分享了XListView實(shí)現(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);
//是否開(kāi)啟下拉刷新 上拉加載
//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);
}
});
//一進(jìn)來(lái)就去加載第一頁(yè)數(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, "請(qǐng)求數(shù)據(jù)錯(cuò)誤", 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);
}
}
//通過(guò) 加載 / 刷新 完成
private void loadCompleted() {
//通過(guò)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)在緩存額外選項(xiàng), 最大的寬度,高度
//.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 內(nèi)存緩存文件的最大長(zhǎng)寬
//.diskCacheExtraOptions(480, 800, null) // 本地緩存的詳細(xì)信息(緩存的最大長(zhǎng)寬),最好不要設(shè)置這個(gè)
//線程池配置
//.taskExecutor()
//.taskExecutorForCachedImages()
//.threadPoolSize(3) // default 線程池內(nèi)加載的數(shù)量
//.threadPriority(Thread.NORM_PRIORITY - 2) // default 設(shè)置當(dāng)前線程的優(yōu)先級(jí)
//任務(wù)處理優(yōu)先級(jí) Fist In Fist Out
//.tasksProcessingOrder(QueueProcessingType.FIFO) // default
//內(nèi)存中不緩存一張圖片的多個(gè)尺寸大小
//.denyCacheImageMultipleSizesInMemory()
//內(nèi)在緩存策略
//.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通過(guò)自己的內(nèi)存緩存實(shí)現(xiàn)
//內(nèi)存緩存大小
//.memoryCacheSize(2 * 1024 * 1024) // 內(nèi)存緩存的最大值
//內(nèi)在緩存大小:占用百分比
.memoryCacheSizePercentage(13) // default
//磁盤(pán)緩存策略
//.diskCache(new LruDiskCache()) // default 可以自定義緩存路徑
//磁盤(pán)緩存大小
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)緩存的最大值
//.diskCacheFileCount(100) // 可以緩存的文件數(shù)量
// default為使用HASHCODE對(duì)UIL進(jìn)行加密命名, 還可以用MD5(new Md5FileNameGenerator())加密
//.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
//.imageDownloader(new BaseImageDownloader(context)) // default
//(new BaseImageDecoder(false)) // default
//加載具體圖片時(shí)的一些配置
.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藍(lán)色占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)
//加載時(shí)、加載錯(cuò)誤時(shí)展示什么內(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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中使用am命令實(shí)現(xiàn)在命令行啟動(dòng)程序詳解
這篇文章主要介紹了Android中使用am命令實(shí)現(xiàn)在命令行啟動(dòng)程序詳解,本文詳細(xì)講解了am命令的語(yǔ)法,然后給出了啟動(dòng)內(nèi)置程序的操作實(shí)例,需要的朋友可以參考下2015-04-04
Flutter 首頁(yè)必用組件NestedScrollView的示例詳解
今天介紹的組件是NestedScrollView,大部分的App首頁(yè)都會(huì)用到這個(gè)組件。對(duì)Flutter 首頁(yè)必用組件NestedScrollView的相關(guān)知識(shí)感興趣的一起看看吧2020-05-05
Android用戶界面開(kāi)發(fā)之:TextView的使用實(shí)例
Android用戶界面開(kāi)發(fā)之:TextView的使用實(shí)例,需要的朋友可以參考一下2013-05-05
使用Android studio3.6的java api方式調(diào)用opencv
這篇文章主要介紹了Android studio3.6的java api方式調(diào)用opencv的代碼詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
解析android 流量監(jiān)測(cè)的實(shí)現(xiàn)原理
本篇文章是對(duì)android中流量監(jiān)測(cè)的實(shí)現(xiàn)原理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

