黑马智慧北京第4天

6 篇文章 0 订阅

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();
		}
	}


2.ListView点击已读的封装

<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>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值