1.ListView下拉刷新 和加载更多
①.xml布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<ImageView
android:id="@+id/iv_arr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/common_listview_headview_red_arrow" />
<ProgressBar
android:id="@+id/pb_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/custom_progress"
android:layout_gravity="center"
android:visibility="invisible" />
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下拉刷新"
android:textColor="#f00"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2015-03-10 17:07:07"
android:textColor="@android:color/darker_gray"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
②.RefreshView的整体框架
//下拉刷新的加载头view
public class RefreshListView extends ListView implements OnScrollListener,
android.widget.AdapterView.OnItemClickListener {
private float startY;
private float endY;
private View headerView;
private int measuredHeight;
private static final int STATE_PULL_REFRESH = 0;
private static final int STATE_RELEASE_REFRESH = 1;
private static final int STATE_REFRESHING = 2;
private int State = STATE_PULL_REFRESH;// 默认状态是下拉
private TextView tv_title;
private TextView tv_time;
private ImageView iv_arr;
private ProgressBar pb_progress;
private RotateAnimation downanim;
private RotateAnimation refreshanim;
private View footerView;
private ProgressBar pb_footer;
private TextView tv_footer;
private int footViewHeight;
public RefreshListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initHeadView();
initFootView();
}
public RefreshListView(Context context, AttributeSet attrs) {
super(context, attrs);
initHeadView();
initFootView();
}
public RefreshListView(Context context) {
super(context);
initHeadView();
initFootView();
}
private void initFootView() {
footerView = View.inflate(getContext(),
R.layout.refresh_listview_footer, null);
this.addFooterView(footerView);
pb_footer = (ProgressBar) footerView
.findViewById(R.id.pb_pull_list_header);
tv_footer = (TextView) footerView
.findViewById(R.id.tv_pull_list_header_title);
// 自定义的view获得高需要去先通知测量
footerView.measure(0, 0);
footViewHeight = footerView.getMeasuredHeight();
footerView.setPadding(0, -footViewHeight, 0, 0);
this.setOnScrollListener(this);
}
private void initHeadView() {
headerView = View.inflate(getContext(), R.layout.refresh_header, null);
tv_title = (TextView) headerView.findViewById(R.id.tv_title);
tv_time = (TextView) headerView.findViewById(R.id.tv_time);
iv_arr = (ImageView) headerView.findViewById(R.id.iv_arr);
pb_progress = (ProgressBar) headerView.findViewById(R.id.pb_progress);
this.addHeaderView(headerView);
headerView.measure(0, 0);// 通知测量
measuredHeight = headerView.getMeasuredHeight();
// 默认将其隐藏
headerView.setPadding(0, -measuredHeight, 0, 0);
marrAnimation();
}
//处理下拉刷新的滑动事件
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (startY == -1) {
startY = ev.getRawY();
}
if (State == STATE_REFRESHING) {
break;// 如果正在刷新,设置不能下拉。返回
}
endY = ev.getRawY();
float dy = endY - startY;
// 如果是下拉并且是第一个才下拉
if (dy > 0 && getFirstVisiblePosition() == 0) {
int padding = (int) (dy - measuredHeight);
headerView.setPadding(0, padding, 0, 0);
// 状态改为释放刷新
if (padding > 0 && State != STATE_RELEASE_REFRESH) {
State = STATE_RELEASE_REFRESH;
StateChange();
// 状态改为下拉刷新
} else if (padding < 0 && State != STATE_PULL_REFRESH) {
State = STATE_PULL_REFRESH;
StateChange();
}
return true;// 避免其他事件处理
}
break;
case MotionEvent.ACTION_UP:
startY = -1;
if (State == STATE_RELEASE_REFRESH) {// 如果是释放刷新 变为正在刷新
State = STATE_REFRESHING;
headerView.setPadding(0, 0, 0, 0);
StateChange();
} else if (State == STATE_PULL_REFRESH) {// 如果是松开
// State = STATE_RELEASE_REFRESH;
// 隐藏标题
headerView.setPadding(0, -measuredHeight, 0, 0);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
//通过状态改变布局显示
private void StateChange() {
switch (State) {
case STATE_PULL_REFRESH:// 下拉状态
tv_title.setText("下拉刷新");
iv_arr.setVisibility(View.VISIBLE);
pb_progress.setVisibility(View.INVISIBLE);
iv_arr.startAnimation(downanim);
break;
case STATE_RELEASE_REFRESH:// 松开状态
tv_title.setText("松开刷新");
iv_arr.setVisibility(View.VISIBLE);
pb_progress.setVisibility(View.INVISIBLE);
iv_arr.startAnimation(refreshanim);
break;
case STATE_REFRESHING:// 正在刷新状态
tv_title.setText("正在刷新...");
iv_arr.clearAnimation();// 必须先清除动画才可以设置不可见
iv_arr.setVisibility(View.INVISIBLE);
pb_progress.setVisibility(View.VISIBLE);
//回调监听
if (onCompleteRefreshListener != null) {
onCompleteRefreshListener.noShowRefresh();
}
break;
}
}
// 给箭头设置动画
private void marrAnimation() {
downanim = new RotateAnimation(-180, -360,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
downanim.setDuration(200);
downanim.setFillAfter(true);
refreshanim = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);
refreshanim.setDuration(200);
refreshanim.setFillAfter(true);
}
// 接口调用,加载数据时回调接口
private OnCompleteRefreshListener onCompleteRefreshListener;
public void setOnCompleteRefreshListener(
OnCompleteRefreshListener onCompleteRefreshListener) {
this.onCompleteRefreshListener = onCompleteRefreshListener;
}
public interface OnCompleteRefreshListener {
//完成刷新时调用
public void noShowRefresh();
//完成加载更多调用
public void noShowLoadMore();
}
// 完成刷新之后就将其隐藏的方法
public void OnRefreshComplete(boolean isLoadMore) {
if (isLoadMore) {
// 隐藏脚
footerView.setPadding(0, -footViewHeight, 0, 0);
} else {
State = STATE_PULL_REFRESH;
tv_title.setText("下拉刷新");
iv_arr.setVisibility(View.VISIBLE);
pb_progress.setVisibility(View.INVISIBLE);
// 刷新完之后就隐藏头
headerView.setPadding(0, -measuredHeight, 0, 0);
tv_time.setText("最后刷新:" + getCurrentTime());
}
}
// 获取系统时间
public String getCurrentTime() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd,HH:mm:ss");
return format.format(new Date());
}
/** 加载更多监听 */
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_FLING
|| scrollState == SCROLL_STATE_IDLE) {// 如果是空闲或者是滑动
if (getLastVisiblePosition() == getCount() - 1) {// 如果是最后一个
// 显示加载更多
// footerView.setVisibility(View.VISIBLE);
footerView.setPadding(0, 0, 0, 0);
setSelection(getCount() - 1);
System.out.println("到底了");
// 设置监听,当加载完数据之后就回调隐藏加载更多
if (onCompleteRefreshListener != null) {
onCompleteRefreshListener.noShowLoadMore();
}
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
// 对点击的item进行包装。因为包含了两个HeadVIew
private OnItemClickListener mlistener;
@Override
public void setOnItemClickListener(
android.widget.AdapterView.OnItemClickListener listener) {
super.setOnItemClickListener(this);
mlistener = listener;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
int headerViewsCount = this.getHeaderViewsCount();
mlistener.onItemClick(parent, view, position - headerViewsCount, id);
}
}
③.下拉刷新具体步骤
---1-----自定义RefreshView 添加HeadView
<span style="white-space:pre"> </span>private void initHeadView() {
headerView = View.inflate(getContext(), R.layout.refresh_header, null);
tv_title = (TextView) headerView.findViewById(R.id.tv_title);
tv_time = (TextView) headerView.findViewById(R.id.tv_time);
iv_arr = (ImageView) headerView.findViewById(R.id.iv_arr);
pb_progress = (ProgressBar) headerView.findViewById(R.id.pb_progress);
this.addHeaderView(headerView);
headerView.measure(0, 0);// 通知测量
measuredHeight = headerView.getMeasuredHeight();
// 默认将其隐藏
headerView.setPadding(0, -measuredHeight, 0, 0);
marrAnimation();
}
----2------设置触摸状态
//处理下拉刷新的滑动事件
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
if (startY == -1) {
startY = ev.getRawY();
}
if (State == STATE_REFRESHING) {
break;// 如果正在刷新,设置不能下拉。返回
}
endY = ev.getRawY();
float dy = endY - startY;
// 如果是下拉并且是第一个才下拉
if (dy > 0 && getFirstVisiblePosition() == 0) {
int padding = (int) (dy - measuredHeight);
headerView.setPadding(0, padding, 0, 0);
// 状态改为释放刷新
if (padding > 0 && State != STATE_RELEASE_REFRESH) {
State = STATE_RELEASE_REFRESH;
StateChange();
// 状态改为下拉刷新
} else if (padding < 0 && State != STATE_PULL_REFRESH) {
State = STATE_PULL_REFRESH;
StateChange();
}
return true;// 避免其他事件处理
}
break;
case MotionEvent.ACTION_UP:
startY = -1;
if (State == STATE_RELEASE_REFRESH) {// 如果是释放刷新 变为正在刷新
State = STATE_REFRESHING;
headerView.setPadding(0, 0, 0, 0);
StateChange();
} else if (State == STATE_PULL_REFRESH) {// 如果是松开
// State = STATE_RELEASE_REFRESH;
// 隐藏标题
headerView.setPadding(0, -measuredHeight, 0, 0);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
----3--------改变布局
//通过状态改变布局显示
private void StateChange() {
switch (State) {
case STATE_PULL_REFRESH:// 下拉状态
tv_title.setText("下拉刷新");
iv_arr.setVisibility(View.VISIBLE);
pb_progress.setVisibility(View.INVISIBLE);
iv_arr.startAnimation(downanim);
break;
case STATE_RELEASE_REFRESH:// 松开状态
tv_title.setText("松开刷新");
iv_arr.setVisibility(View.VISIBLE);
pb_progress.setVisibility(View.INVISIBLE);
iv_arr.startAnimation(refreshanim);
break;
case STATE_REFRESHING:// 正在刷新状态
tv_title.setText("正在刷新...");
iv_arr.clearAnimation();// 必须先清除动画才可以设置不可见
iv_arr.setVisibility(View.INVISIBLE);
pb_progress.setVisibility(View.VISIBLE);
//回调监听
if (onCompleteRefreshListener != null) {
onCompleteRefreshListener.noShowRefresh();
}
break;
}
}
④.加载更多
-----1--------设置脚View(footView)
<span style="white-space:pre"> </span>private void initFootView() {
footerView = View.inflate(getContext(),
R.layout.refresh_listview_footer, null);
this.addFooterView(footerView);
pb_footer = (ProgressBar) footerView
.findViewById(R.id.pb_pull_list_header);
tv_footer = (TextView) footerView
.findViewById(R.id.tv_pull_list_header_title);
// 自定义的view获得高需要去先通知测量
footerView.measure(0, 0);
footViewHeight = footerView.getMeasuredHeight();
footerView.setPadding(0, -footViewHeight, 0, 0);
this.setOnScrollListener(this);
}
----2-------对滑动事件监听 设置footView的状态
/** 加载更多监听 */
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_FLING
|| scrollState == SCROLL_STATE_IDLE) {// 如果是空闲或者是滑动
if (getLastVisiblePosition() == getCount() - 1) {// 如果是最后一个
// 显示加载更多
// footerView.setVisibility(View.VISIBLE);
footerView.setPadding(0, 0, 0, 0);
setSelection(getCount() - 1);
System.out.println("到底了");
// 设置监听,当加载完数据之后就回调隐藏加载更多
if (onCompleteRefreshListener != null) {
onCompleteRefreshListener.noShowLoadMore();
}
}
}
}
⑤.事件回调监听,当下拉刷新数据完毕 和 加载更多完毕
// 接口调用,加载数据时回调接口
private OnCompleteRefreshListener onCompleteRefreshListener;
public void setOnCompleteRefreshListener(
OnCompleteRefreshListener onCompleteRefreshListener) {
this.onCompleteRefreshListener = onCompleteRefreshListener;
}
public interface OnCompleteRefreshListener {
//完成刷新时调用
public void noShowRefresh();
//完成加载更多调用
public void noShowLoadMore();
}
listView设置回调监听
//11个页签的监听
listView.setOnCompleteRefreshListener(new OnCompleteRefreshListener() {
//获取刷新数据之后
@Override
public void noShowRefresh() {
getDataFromServer(murl);
}
<span style="white-space:pre"> </span>//获取加载更多数据
@Override
public void noShowLoadMore() {
if (moreUrl != null) {
getMoreDataFromServer(moreUrl);
} else {
Toast.makeText(mActivity, "没有更多数据", 0).show();
listView.OnRefreshComplete(true);
}
}
});
隐藏下拉刷新 listView.OnRefreshComplete(false);
隐藏加载更多 listView.OnRefreshComplete(true);
⑥.刷新解析数据 和 加载更多解析数据
// 解析数据
protected void parseData(String result, boolean isLoadMore) {
Gson gson = new Gson();
tabdata = gson.fromJson(result, TabData.class);
topnews = tabdata.data.topnews;
news = tabdata.data.news;
String more = tabdata.data.more;
if (!TextUtils.isEmpty(more)) {
moreUrl = GlobalContants.SERVER_URL + more;
} else {
moreUrl = null;
}
if (!isLoadMore) {// 如果不是加载更多
if (topnews != null) {
// System.out.println(tabdata);
// 在这之后才调用 否则空指针,因为请求数据和解析都是子线程中
mViewPager.setAdapter(new TopNewsAdapter());
// 因为这个和viewpager一起在用,所以让这个设置监听,不然不会改变
indicator.setOnPageChangeListener(this);
indicator.setViewPager(mViewPager);
indicator.setSnap(true);// 支持快照显示
indicator.onPageSelected(0);// 默认设置为第一个点
tvTitle.setText(topnews.get(0).title);// 默认设置第一页的标题
}
if (news != null) {
myNewsAdapter = new myNewsAdapter();
listView.setAdapter(myNewsAdapter);
}
if (handler == null) {
handler = new Handler() {
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int currentItem = mViewPager.getCurrentItem();
if (currentItem < topnews.size() - 1) {
currentItem++;
} else {
currentItem = 0;
}
mViewPager.setCurrentItem(currentItem);
handler.sendEmptyMessageDelayed(0, 3000);
}
};
handler.sendEmptyMessageDelayed(0, 3000);
}
} else {// 如果是加载更多
ArrayList<TabNewsData> news2 = tabdata.data.news;
news.addAll(news2);// 将这个数据添加到集合中
myNewsAdapter.notifyDataSetChanged();
}
}
<span style="white-space:pre"> </span>listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
<span style="white-space:pre"> </span>//保存点击的item的id到SharedPreference中
String clickId = news.get(position).id;
ids = PrefUtils.getString(mActivity, "read_id", "");
if (!ids.contains(clickId)) {// 133,555,
clickId = clickId + ",";
ids = ids + clickId;
PrefUtils.putString(mActivity, "read_id", ids);
}
myNewsAdapter.notifyDataSetChanged();
刷新适配器的数据 通知适配器中 设置文字颜色
// 设置文字被点击的颜色
ids = PrefUtils.getString(mActivity, "read_id", "");
if (ids.contains(tabNewsData.id)) {
holder.tvTitle.setTextColor(Color.GRAY);
} else {
holder.tvTitle.setTextColor(Color.BLACK);
}
点击的时候封装RefreshListView的 position ,因为有两个HeadView
// 对点击的item进行包装。因为包含了两个HeadVIew
private OnItemClickListener mlistener;
@Override
public void setOnItemClickListener(
android.widget.AdapterView.OnItemClickListener listener) {
super.setOnItemClickListener(this);
mlistener = listener;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
int headerViewsCount = this.getHeaderViewsCount();
mlistener.onItemClick(parent, view, position - headerViewsCount, id);
}
3.WebVIew的使用及设置文字的大小
//WebView页面
public class NewsDetailActivity extends Activity implements OnClickListener {
private WebView mWebView;
private ImageButton btnBack;
private ImageButton btnSize;
private ImageButton btnShare;
private ProgressBar pbProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_news_detail);
initView();
initData();
}
private void initData() {
String url = getIntent().getStringExtra("url").replace("10.0.2.2",
GlobalContants.IP);
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);// 支持脚本可以加载更多
settings.setBuiltInZoomControls(true);// 显示缩小缩大按钮
settings.setUseWideViewPort(true);// 支持双击缩放
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);// 网页开始加载
pbProgress.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {// 网页加载结束
super.onPageFinished(view, url);
pbProgress.setVisibility(View.GONE);
}
// 所有的跳转链接都在此回调。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;// 强制让webview去加载,,不使用系统浏览器
}
});
// 可以拿到进度和标题
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
// System.out.println("标题" + title);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// System.out.println("进度" + newProgress);
}
});
mWebView.loadUrl(url);// 加载
}
private void initView() {
mWebView = (WebView) findViewById(R.id.wv_web);
btnBack = (ImageButton) findViewById(R.id.btn_back);
btnSize = (ImageButton) findViewById(R.id.btn_size);
btnShare = (ImageButton) findViewById(R.id.btn_share);
pbProgress = (ProgressBar) findViewById(R.id.pb_progress);
btnBack.setOnClickListener(this);
btnSize.setOnClickListener(this);
btnShare.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back:
finish();
break;
case R.id.btn_size:
showChooseDialog();
break;
case R.id.btn_share:
showShare();
break;
default:
break;
}
}
int currentItemChoose;
int currentItem = 2;
// 显示字体弹出框
private void showChooseDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(
NewsDetailActivity.this);
String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
"超小号字体" };
builder.setTitle("字体设置");
builder.setSingleChoiceItems(items, currentItem,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("选中了:" + which);
currentItemChoose = which;
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
WebSettings settings = mWebView.getSettings();
switch (currentItemChoose) {
case 0:
settings.setTextSize(TextSize.LARGEST);
// settings.setTextZoom(30);
break;
case 1:
settings.setTextSize(TextSize.LARGER);
// settings.setTextZoom(18);
break;
case 2:
settings.setTextSize(TextSize.NORMAL);
// settings.setTextZoom(16);
break;
case 3:
settings.setTextSize(TextSize.SMALLER);
// settings.setTextZoom(14);
break;
case 4:
settings.setTextSize(TextSize.SMALLEST);
// settings.setTextZoom(12);
break;
default:
break;
}
currentItem = currentItemChoose;
}
});
builder.setNegativeButton("取消", null);
Dialog dialog = builder.create();
dialog.show();
}
4.缓存json数据在SharedPreference中(也可以保存在文件中)
<span style="white-space:pre"> </span>String result = (String) responseInfo.result;
System.out.println("返回数据" + result);
CacheUtils.putCache(mActivity,GlobalContants.CATEGORIES_URL, result);
②.加载数据时先从缓存中读取,让用户先可以看见过去的信息,然后再更新数据
String cache = CacheUtils.getCache(mActivity,
GlobalContants.CATEGORIES_URL, null);
if (!TextUtils.isEmpty(cache)) {
parseData(cache);//如果没网络。可以让客户先看看
}
getDataFromServer();//获取数据
5.对ViewPager的自动轮播设置
①.轮播设置
<span style="white-space:pre"> </span>if (handler == null) {
handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
int currentItem = mViewPager.getCurrentItem();
//如果不是最后一张图片,就3s跳到下一张
if (currentItem < topnews.size() - 1) {
currentItem++;
} else {
//如果是最后一张,就跳到第一张
currentItem = 0;
}
mViewPager.setCurrentItem(currentItem);
handler.sendEmptyMessageDelayed(0, 3000);
}
};
handler.sendEmptyMessageDelayed(0, 3000);
}
②.设置手指在图片上的触摸监听
class OntouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
//按下不滑动图片
case MotionEvent.ACTION_DOWN:
handler.removeCallbacksAndMessages(null);// 清除所有消息
break;
// 避免事件取消
case MotionEvent.ACTION_CANCEL:
handler.sendEmptyMessageDelayed(0, 3000);
break;
//发送消息
case MotionEvent.ACTION_UP:
handler.sendEmptyMessageDelayed(0, 3000);
break;
default:
break;
}
return true;
}
}
6.组图模块的定义
public class PhotoMenuDetailPager extends BaseMenuDetailPager {
private ListView lvPhoto;
private GridView gvPhoto;
private ImageButton btnPhoto;
private PhotoData photoData;
private ArrayList<PhotoInfo> newsList;
private Myadapter adapter;
public PhotoMenuDetailPager(Activity activity, ImageButton btnPhoto) {
super(activity);
this.btnPhoto = btnPhoto;
//设置点击按钮切换ListView和GridView
if(btnPhoto!=null)
btnPhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
changeDisplay();
}
});
}
@Override
public View initView() {
View view = View.inflate(mActivity, R.layout.menu_photo_pager, null);
lvPhoto = (ListView) view.findViewById(R.id.lv_photo);
gvPhoto = (GridView) view.findViewById(R.id.gv_photo);
adapter = new Myadapter();
return view;
}
private boolean islistDisplay = false;
protected void changeDisplay() {
if(islistDisplay){
islistDisplay = false;
lvPhoto.setVisibility(View.VISIBLE);
gvPhoto.setVisibility(View.GONE);
btnPhoto.setImageResource(R.drawable.icon_pic_grid_type);
}else{
islistDisplay = true;
lvPhoto.setVisibility(View.GONE);
gvPhoto.setVisibility(View.VISIBLE);
btnPhoto.setImageResource(R.drawable.icon_pic_list_type);
}
}
@Override
public void initData() {
super.initData();
//缓存机制
String cache = CacheUtils.getCache(mActivity, GlobalContants.PHOTOSURL,
"");
if (!TextUtils.isEmpty(cache)) {
parseData(cache);
}
getDataFromServer();
}
private void getDataFromServer() {
HttpUtils httpUtils = new HttpUtils();
httpUtils.send(HttpMethod.GET, GlobalContants.PHOTOSURL,
new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
parseData(result);
//保存数据到缓存中
CacheUtils.putCache(mActivity,
GlobalContants.PHOTOSURL, result);
}
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
error.printStackTrace();
}
});
}
protected void parseData(String result) {
Gson gson = new Gson();
photoData = gson.fromJson(result, PhotoData.class);
newsList = photoData.data.news;
lvPhoto.setAdapter(adapter);
gvPhoto.setAdapter(adapter);
}
class Myadapter extends BaseAdapter {
//private BitmapUtils bitmapUtils;
private MybitmpaUtils bitmpaUtils;
Myadapter(){
bitmpaUtils = new MybitmpaUtils();
//bitmapUtils.configDefaultLoadingImage(R.drawable.news_pic_default);
}
@Override
public int getCount() {
return newsList.size();
}
@Override
public Object getItem(int position) {
return newsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(mActivity, R.layout.list_photo_item,
null);
holder = new ViewHolder();
holder.tvTitle = (TextView) convertView
.findViewById(R.id.tv_title);
holder.ivPic = (ImageView) convertView
.findViewById(R.id.iv_pic);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PhotoInfo photoInfo = newsList.get(position);
holder.tvTitle.setText(photoInfo.title);
String replace = photoInfo.listimage.replace("10.0.2.2", GlobalContants.IP);
//bitmapUtils.display(holder.ivPic, replace);
//从自己的图片加载工具中加载
bitmpaUtils.display(holder.ivPic, replace);
return convertView;
}
}
static class ViewHolder {
public TextView tvTitle;
public ImageView ivPic;
}
}
两个view的布局文件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/lv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#fff"
android:divider="@null" />
<GridView
android:id="@+id/gv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:visibility="gone" />
</FrameLayout>