马上要过年了,还有3天哦~
listView作为最常用的控件,对它的优化,真的是非常重要的,我也从网上找资料,真的是骗子特别多,复制粘贴的也特别多,各种转载,没有啥干货,于是自己写个demo纪念一下,兄弟们也帮我留言改进下,毕竟以后会用到的,感谢大家~
实现的效果图如下
使用imageLoader的滑动过程中不加载数据,停止滑动加载数据进行优化,点击界面进入网页Activity,适配网页。
同时可以动态改变欢迎界面,哈哈,上一次的代码被我用到这里来了。
用的资源地址是聚合数据的新闻头条数据,固定时间刷新数据,
使用android 原生的下拉刷新数据SwipeRefreshLayout,请求数据的。
好了,说说主要的吧
/**
* 作者:朱亮 on 2017/1/24 16:00
* 邮箱:171422696@qq.com
*
* @Description: ${新闻界面}(这里用一句话描述这个方法的作用)
*/
public class NewsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeRefreshView;
private RelativeLayout bd_empty_view;
private ListView listView;
private NewsAdapter newsAdapter;
private JSONArray jsonArray = null;
private HashSet<String> hashSet ;
private int startPos;
private int endPos;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.newsfragment, container, false);//关联布局文件
swipeRefreshView = (SwipeRefreshLayout) rootView.findViewById(R.id.swipeRefreshView);
//设置刷新时动画的颜色,可以设置4个
swipeRefreshView.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
swipeRefreshView.setOnRefreshListener(this);
listView = (ListView) rootView.findViewById(R.id.newsListView);
bd_empty_view = (RelativeLayout) rootView.findViewById(R.id.bd_empty_view);
initAdapter();//初始化填充
return rootView;
}
//设置Adapter
private void initAdapter() {
hashSet = new HashSet<>();
jsonArray = new JSONArray();
newsAdapter = new NewsAdapter(getContext());
listView.setAdapter(newsAdapter);
listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(),true,true));//这里设置的是ImageLoader的滑动监听
}
//下拉刷新时
@Override
public void onRefresh() {
HttpManager.getNews(new GetCallBack(getContext()) {
@Override
public void onSuccessState(JSONObject result) {
swipeRefreshView.setRefreshing(false);
JSONArray arrays = result.getJSONObject("result").getJSONArray("data");
for(int x = 0 ; x < arrays.size() ; x++){//去重复数据
if(!hashSet.contains(arrays.getJSONObject(x).getString("uniquekey"))){
hashSet.add(arrays.getJSONObject(x).getString("uniquekey"));
jsonArray.add(arrays.getJSONObject(x));
}
}
newsAdapter.setData(jsonArray);
}
@Override
public void OnErrorFailure(String text) {
swipeRefreshView.setRefreshing(false);
Log.e("LOGS","获取失败 = " + text );
}
});
}
//当没有数据是,显示没有数据背景
private void setEmptyBackground(){
bd_empty_view.setVisibility(View.VISIBLE);
listView.setEmptyView(bd_empty_view);
}
}
主要的是这个
listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(),true,true));//这里设置的是ImageLoader的滑动监听
和这个去除重复加载数据
JSONArray arrays = result.getJSONObject("result").getJSONArray("data");
for(int x = 0 ; x < arrays.size() ; x++){//去重复数据
if(!hashSet.contains(arrays.getJSONObject(x).getString("uniquekey"))){
hashSet.add(arrays.getJSONObject(x).getString("uniquekey"));
jsonArray.add(arrays.getJSONObject(x));
}
}
newsAdapter.setData(jsonArray);
再看看Adapter 里面,里面用到了一个自定义类
MultiImageView,这个从网上找的,可一根据你传入图片的数量,自动换行和设置大小,还有一个工具类ViewHolder的使用。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null){
convertView= LayoutInflater.from(mContext).inflate(R.layout.news_item,null);
}
RelativeLayout rela = ViewHolder.get(convertView,R.id.rela);
TextView newsTitle = ViewHolder.get(convertView,R.id.newsTitle);
MultiImageView multiImageView = ViewHolder.get(convertView,R.id.multiImageView);
TextView text_time = ViewHolder.get(convertView,R.id.text_time);
TextView text_From = ViewHolder.get(convertView,R.id.text_From);
newsTitle.setText(jsonArray.getJSONObject(position).getString("title"));
text_time.setText(jsonArray.getJSONObject(position).getString("date"));
text_From.setText(jsonArray.getJSONObject(position).getString("author_name"));
ArrayList<String> list = new ArrayList<>();
str[0] = jsonArray.getJSONObject(position).getString("thumbnail_pic_s");
str[1] = jsonArray.getJSONObject(position).getString("thumbnail_pic_s02");
str[2] = jsonArray.getJSONObject(position).getString("thumbnail_pic_s03");
for(int x = 0 ; x < str.length ; x ++){//将后台给的图片全部做成集合形式
if(str[x] != null){
list.add(str[x]);
}
}
multiImageView.setList(list);//传递给自定义图片对象
rela.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext ,WebActivity.class);
intent.putExtra("url",jsonArray.getJSONObject(position).getString("url"));
mContext.startActivity(intent);
}
});
/**
* 关注的状态
*/
return convertView;
}
最后在multiImageView里设置imageloader异步下载即可。
DisplayImageOptions girl_options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.no_loder)
.showImageForEmptyUri(R.drawable.no_loder)
.showImageOnFail(R.drawable.no_loder)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
try {
//ImageLoader 开始异步加载图片
ImageLoader.getInstance().loadImage(url, girl_options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
imageView.setImageResource(R.drawable.anim_circle_128_0);//加载过程中显示
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
imageView.setImageResource(R.drawable.anim_circle_128_0);
}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
imageView.setImageBitmap(bitmap);//图片下载完毕将图片设置进去
}
@Override
public void onLoadingCancelled(String s, View view) {
imageView.setImageResource(R.drawable.default_ptr_rotate);//图片下载失败显示的图片
}
});
}catch (OutOfMemoryError error) {
error.printStackTrace();
}
好了,完成。
最后看下数据缓存是不是缓存下来了,我从其他界面切回来,发现已经被缓存了
好了,关键几步就是这样,如果需要看源码的,