package org.xutils.sample;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import org.xutils.common.Callback;
import org.xutils.common.util.DensityUtil;
import org.xutils.http.RequestParams;
import org.xutils.image.ImageOptions;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by wyouflf on 15/11/4.
*/
@ContentView(R.layout.fragment_image)
public class ImageFragment extends BaseFragment {
private String[] imgSites = {
"http://image.baidu.com/",
"http://www.22mm.cc/",
"http://www.moko.cc/",
"http://eladies.sina.com.cn/photo/",
"http://www.youzi4.com/"
};
ImageOptions imageOptions;
@ViewInject(R.id.lv_img)
private ListView imageListView;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
imageOptions = new ImageOptions.Builder()
.setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))
.setRadius(DensityUtil.dip2px(5))
// 如果ImageView的大小不是定义为wrap_content, 不要crop.
.setCrop(true) // 很多时候设置了合适的scaleType也不需要它.
// 加载中或错误图片的ScaleType
//.setPlaceholderScaleType(ImageView.ScaleType.MATRIX)
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setLoadingDrawableId(R.mipmap.ic_launcher)
.setFailureDrawableId(R.mipmap.ic_launcher)
.build();
imageListAdapter = new ImageListAdapter();
imageListView.setAdapter(imageListAdapter);
// 加载url请求返回的图片连接给listview
// 这里只是简单的示例,并非最佳实践,图片较多时,最好上拉加载更多...
for (String url : imgSites) {
loadImgList(url);
}
}
@Event(value = R.id.lv_img, type = AdapterView.OnItemClickListener.class)
private void onImageItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(this.getActivity(), BigImageActivity.class);
intent.putExtra("url", imageListAdapter.getItem(position).toString());
this.getActivity().startActivity(intent);
}
private void loadImgList(String url) {
x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
imageListAdapter.addSrc(getImgSrcList(result));
imageListAdapter.notifyDataSetChanged();//通知listview更新数据
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
private ImageListAdapter imageListAdapter;
private class ImageListAdapter extends BaseAdapter {
private final LayoutInflater mInflater;
private ArrayList<String> imgSrcList;
public ImageListAdapter() {
super();
mInflater = LayoutInflater.from(getContext());
imgSrcList = new ArrayList<String>();
}
public void addSrc(List<String> imgSrcList) {
this.imgSrcList.addAll(imgSrcList);
}
public void addSrc(String imgUrl) {
this.imgSrcList.add(imgUrl);
}
@Override
public int getCount() {
return imgSrcList.size();
}
@Override
public Object getItem(int position) {
return imgSrcList.get(position);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
ImageItemHolder holder = null;
if (view == null) {
view = mInflater.inflate(R.layout.image_item, parent, false);
holder = new ImageItemHolder();
x.view().inject(holder, view);
view.setTag(holder);
} else {
holder = (ImageItemHolder) view.getTag();
}
holder.imgPb.setProgress(0);
x.image().bind(holder.imgItem,
imgSrcList.get(position),
imageOptions,
new CustomBitmapLoadCallBack(holder));
return view;
}
}
private class ImageItemHolder {
@ViewInject(R.id.img_item)
private ImageView imgItem;
@ViewInject(R.id.img_pb)
private ProgressBar imgPb;
}
public class CustomBitmapLoadCallBack implements Callback.ProgressCallback<Drawable> {
private final ImageItemHolder holder;
public CustomBitmapLoadCallBack(ImageItemHolder holder) {
this.holder = holder;
}
@Override
public void onWaiting() {
this.holder.imgPb.setProgress(0);
}
@Override
public void onStarted() {
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
this.holder.imgPb.setProgress((int) (current * 100 / total));
}
@Override
public void onSuccess(Drawable result) {
this.holder.imgPb.setProgress(100);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
}
/**
* 得到网页中图片的地址
*/
public static List<String> getImgSrcList(String htmlStr) {
List<String> pics = new ArrayList<String>();
String regEx_img = "<img.*?src=\"http://(.*?).jpg\""; // 图片链接地址
Pattern p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
Matcher m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
String src = m_image.group(1);
if (src.length() < 100) {
pics.add("http://" + src + ".jpg");
//pics.add("http://f.hiphotos.baidu.com/zhidao/pic/item/2fdda3cc7cd98d104cc21595203fb80e7bec907b.jpg");
}
}
return pics;
}
}