《智慧東莞》主要核心步驟代碼
1、viewpager的使用過程核心代碼
mViewPager = (ViewPager) findViewById(R.id.vp_guide);
initData();// 一定要先初始化數據
mViewPager.setAdapter(new GuideAdapter());// 再設置數據
Private void iniData(){
1、定義一個數組
2、封裝到list裡面
For(int i=0;i
ImageView view = new ImageView(this);
view.setBackgroundResource(mImageIds[i]);// 通過設置背景,可以讓寬高填充布局
// view.setImageResource(resId)
mImageViewList.add(view);
}
}
class GuideAdapter extends PagerAdapter {
// item的個數
@Override
public int getCount() {
return mImageViewList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
// 初始化item布局
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView view = mImageViewList.get(position);
container.addView(view);
return view;
}
// 銷毀item
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
3、設置屏幕無標題
(1)Androidmainfest.xml
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
(2)代碼設置
requestWindowFeature(Window.FEATURE_NO_TITLE);// 設置沒有主題(一定要設置在setContentView前面)
4、設置小圓點間隔
ImageView point = new ImageView(this);
point.setImageResource(R.drawable.shape_point_gray);// 設置圖片(shape形狀)
// 初始化布局參數, 寬高包裹內容,父控制項是誰,就是誰聲明的布局參數
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
if (i > 0) {
// 從第二個點開始設置左邊距
params.leftMargin = 10;
}
point.setLayoutParams(params);// 設置布局參數
llContainer.addView(point);// 給容器添加圓點
5、話說也奇葩了 我本來要添加一個 LinearLayout(horizontal)到工程里。但是在添加完id後就直接給我報了這麼個error,我日
No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically
解決辦法:加入android:orientation="horizontal"
6、小紅點移動核心代碼
兩個小紅點的距離=第二個小紅點的左邊距-第一個小紅點左邊距
// 計算兩個圓點的距離
// 移動距離=第二個圓點left值 - 第一個圓點left值
// 布局畫上去的流程:measure->layout(確定位置)->draw(activity的onCreate方法執行結束之後才會走此流程)
// mPointDis = llContainer.getChildAt(1).getLeft()
// - llContainer.getChildAt(0).getLeft();
// System.out.println("圓點距離:" + mPointDis);
// 監聽layout方法結束的事件,位置確定好之後再獲取圓點間距
7、開始體驗按鈕的設置
先在布局文件設置:android:visibility="invisible"
然後判斷是第三個位置讓button顯示:
if(position==imageViewsList.size()-1){
btnStrart.setVisibility(View.VISIBLE);
}
else{
btnStrart.setVisibility(View.INVISIBLE);
}
8、左菜單的一些基本設置
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉標題,
// 必須在setContentView之前調用
setContentView(R.layout.activity_main);
//Utils.doSomthing();
//R.drawable.p_10
setBehindContentView(R.layout.left_menu);
SlidingMenu slidingMenu = getSlidingMenu();
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//全屏觸摸
slidingMenu.setBehindOffset(200);//屏幕預留200像素寬度
9、frament布局替換原來的布局
private void initFrament(){
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.fl_left_menu,new LeftMenuFrament());
transaction.replace(R.id.fl_main,new LeftMenuFrament());
transaction.commit();
}
10、默認首頁被選中
布局中要選中的按鈕加上一下代碼
android:checked="true"
11、底部5個頁面的實現
先封裝一個基類BasePase,
再搞5個子類繼承basepager,每個子類載入一個布局:
public SettingPager(Activity activity) {
super(activity);
// TODO Auto-generated constructor stub
}
@Override
public void initData() {
TextView textView=new TextView(mActivity);
textView.setText("設置中心");
textView.setTextColor(Color.RED);
textView.setTextSize(22);
textView.setGravity(Gravity.CENTER);
flContent.addView(textView);
}
然後在ContentFrament拿到viewpager ,再設置適配器(再寫兩個方法:ins 、des)
ins:初始化數據(關鍵) 通過mPagers得到當前對象,當前對象調用mRootView得到對於頁面的信息
public Object instantiateItem(ViewGroup container, int position) {
BasePager pager = mPagers.get(position);
View view = pager.mRootView;獲取當前頁面對象的布局
container.addView(view);
return view;
}
des://一定要刪除super.destroyItem(container, position, object);不然會出錯,只滑動兩個viewpager
container.removeView((View) object);
12、禁止contentframent的viewpager的滑動
重寫viewpagerfa的onTouchEvent方法
(1)public class NoscrollViewPager extends ViewPager {
public NoscrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public NoscrollViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return true;//上面都不做
}
}
13、關聯底部標籤(radiobutton)和上面的scrollviewpager
先對radiobutton進行監聽
如何利用viewpager切換頁面
// 底欄標籤切換監聽
rgGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_home:
// 首頁
// mViewPager.setCurrentItem(0);
mViewPager.setCurrentItem(0, false);// 參2:表示是否具有滑動動畫
break;
case R.id.rb_news:
// 新聞中心
mViewPager.setCurrentItem(1, false);
break;
case R.id.rb_smart:
// 智慧服務
mViewPager.setCurrentItem(2, false);
break;
case R.id.rb_gov:
// 政務
mViewPager.setCurrentItem(3, false);
break;
case R.id.rb_setting:
// 設置
mViewPager.setCurrentItem(4, false);
break;
default:
break;
}
}
});
14、viewpager的instantiateItem方法會永遠提前載入下一頁頁面,會造成浪費流量,所以不要在instantiateItem調用初始化數據
可以在radiobutton調用initdata()方法,但代碼重複麻煩,mPagers.get(0).initData();
所以給viewpager設置監聽setOnPageChangeListener
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
BasePager basePager = mPagers.get(position);
basePager.initData();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
mPagers.get(0).initData();//手動載入第一頁數據,不然一打開不會載入第一頁
15、禁用slidingmenu側邊欄(首頁和設置標籤)
(1)在contentframent的viewpager的監聽里的onPageSelected方法設置
public void onPageSelected(int position) {
BasePager basePager = mPagers.get(position);
basePager.initData();
if(position==0 && position==mPagers.size()-1){
slidingMenuEnable(false);
}else{
slidingMenuEnable(true);
}
}
(2)拿到sliding對象,如何設置開啟
只要拿到MainActivity,就可以拿到slidingMenu對象,而contentframent繼承了BaseFrament,BaseFrament裡面已經有 activity
protected void slidingMenuEnable(boolean b) {
MainActivity maUi=(MainActivity) mActivity;
SlidingMenu slidingMenu = maUi.getSlidingMenu();
if(b){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
16、如何請求伺服器,拿到json數據
在新聞中心的initdata方法里利用第三方開源框架
/**
* 從伺服器獲取數據 需要許可權:
*/
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
utils.send(HttpMethod.GET, GlobalConstants.CATEGORY_URL,
new RequestCallBack() {
@Override
public void onSuccess(ResponseInfo responseInfo) {
// 請求成功
String result = responseInfo.result;// 獲取伺服器返回結果
// JsonObject, Gson
processData(result);
// 寫緩存
CacheUtils.setCache(GlobalConstants.CATEGORY_URL,
result, mActivity);
}
@Override
public void onFailure(HttpException error, String msg) {
// 請求失敗
error.printStackTrace();
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
}
});
}
17、如何解析數據,利用第三方框架gson解析
protected void processData(String json) {
Gson gson=new Gson();
mNewsData = gson.fromJson(json, NewsMenu.class);
}
18、設置緩存,先在從伺服器獲取數據時判斷
(1)先定義一個類
public class CacheUtils {
public void setCache(String url, String json, Context ctx) {
PrefUtils.setString(ctx, url, json);
}
public String getCache(String url, Context ctx) {
return PrefUtils.getString(ctx, url, null);
}
}
(2)判斷
//先判斷是否有緩存數據
String cache = CacheUtils.getCache(GrobalContants.CATEGORY_URL, mActivity);
if(!TextUtils.isEmpty(cache)){
processData(cache);
}else{
// 請求伺服器,獲取數據
// 開源框架,xutils
getDataFromServer();
}
19、填充到側邊欄數據
newspager---contmentframent--mainactivity---leftmenuframent
Mainactivity.java得到leftmenuframent
public LeftMenuFrament getLeftMenuFragment(){
FragmentManager fm = getSupportFragmentManager();
LeftMenuFrament fragment = (LeftMenuFrament) fm
.findFragmentByTag(TAG_LEFT_MENU);// 根據標記找到對應的fragment
return fragment;
}
NewsCenterPager.java給側邊欄傳數據
protected void processData(String json) {
Gson gson = new Gson();
mNewsData = gson.fromJson(json, NewsMenu.class);
//得到leftmenuframent
MainActivity mainActivity=(MainActivity) mActivity;
// 獲取側邊欄對象
MainActivity mainUI = (MainActivity) mActivity;
LeftMenuFrament fragment = mainUI.getLeftMenuFragment();
// 給側邊欄設置數據
fragment.setMenuData(mNewsData.data);
}
leftmenuframent.java獲得數據
public void setMenuData(ArrayList data) {
mNewsMenuData = data;
lvList.setAdapter(new LeftMenuAdapter());
}
20、側邊欄第一個默認被選中
在adapter的getView方法
private int mCurrentPos;定義的時候默認是0
if (position == mCurrentPos) {
// 被選中
tvMenu.setEnabled(true);// 文字變為紅色
} else {
// 未選中
tvMenu.setEnabled(false);// 文字變為白色
}
21、側邊欄item被選中:給listview 設置監聽,把當前position賦值給mCurrentPos,然後通過adapter刷新
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1, int position,
long arg3) {
mCurrentPos=position;
adapter.notifyDataSetChanged();//刷新
}
});
22、點擊側邊欄的listview開關側邊欄
改方法在adapter的getview()調用
protected void toggle() {
MainActivity mainUi=(MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
slidingMenu.toggle();//slidingMenu的toggle方法,你關我就開,你開我就開
}
23、點擊事件,是從最外面往裡面傳(重點難點)
最外層的viewpage不攔截裡面的viewpager
重寫viewpager的onInterceptTouchEvent方法(事件攔截)
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return false;// 表示不攔截子空間的事件
}
24、設置指示器的標題,在NewsMenuDetailPager重寫PagerAdapter的getPageTitle方法
@Override
public CharSequence getPageTitle(int position) {
NewsTabData newsTabData = mTabDatas.get(position);
return newsTabData.title;
}
25、viewpagerindicator的使用流程
1、引用庫
2、解決v4包
3、viewpager和指示器綁定,重寫getpagertitle返回標題
4、修改主體樣式
26、拉動指示器viewpagerindicator的時候把側邊欄也拉出來了
在viewpagerindicator庫裡面重寫TabPageIndicator的dispatchTouchEvent方法
//事件分發
//dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//請求所有父控制項不要攔截事件
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
27、新聞中心詳細頁面的viewpager控制側邊欄的開關
在NewsMenuDetailPagerAdapter設置viewpager的監聽事件setOnPageChangeListener
但是設置完indicator罷工,原因是viewpager和indicator已經綁定在一起,而indicator比較強勢
所以不要viewpager監聽setOnPageChangeListener事件,而有indicator設置setOnPageChangeListener事件
mIndicator.setOnPageChangeListener(new OnPageChangeListener() {
// 一定要mIndicator設置,不要mViewPager設置監聽,不然罷工
@Override
public void onPageSelected(int position) {
if (position == 0) {// 打開側邊欄
slidingMenuEnable(true);
} else {// 關閉側邊欄
slidingMenuEnable(false);
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
28、去掉側邊欄的分割線,因為listview本身自帶有分割線
在ListView布局文件中設置:
android:divider="@null"
29、指示器的next按鈕事件實現:通過viewpager的getcurrentitem得到當前的item,再++,重新通過viewpager的setcurrentitem方法設置
@OnClick(R.id.btn_next)
public void nextPager(View view) {
int currentItem = mViewPager.getCurrentItem();
currentItem++;
mViewPager.setCurrentItem(currentItem);
}
30、避免內存溢出和緩存圖片:利用BitmapUtils
在TabDetailPager裡面的TopNewsAdapter類的構造方法中定義BitmapUtils
public TopNewsAdapter() {
bUtils = new BitmapUtils(mActivity);
}
然後在instantiateItem方法中設置網路圖片
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView view = new ImageView(mActivity);
view.setBackgroundResource(R.drawable.topnews_item_default);
view.setScaleType(ScaleType.FIT_XY);//寬高填充父控制項
String imageUrl = topnews.get(position).topimage;
bUtils.display(view, imageUrl);
container.addView(view);
return view;
}
31、如何實現新聞中心,新聞裡面的輪播圖的攔截事件
自定義viewpager,重寫dispatchTouchEvent方法,但不是簡單的return true;
1、上下滑動,攔截
2、向右滑動,第一個頁面,需要攔截
3、向左滑動,最後一個,攔截
根據坐標的偏移量來判斷上下話還是左右話
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) ev.getX();
startY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int endX = (int) ev.getX();
int endY = (int) ev.getY();
int dx = endX - startX;
int dy = endY - startY;
if (Math.abs(dx) > Math.abs(dy)) {// 左右滑動
int currentItem = getCurrentItem();
if (endX > startX)// 向右滑動
{
if (currentItem == 0) {// 第一個位置,攔截
getParent().requestDisallowInterceptTouchEvent(false);// 請求父組件攔截
}
} else {// 向左滑動
int count = getAdapter().getCount();//得到總數(注意)
if (currentItem == count - 1) {
getParent().requestDisallowInterceptTouchEvent(false);// 請求父組件攔截
}
}
} else {// 上下滑動
getParent().requestDisallowInterceptTouchEvent(false);// 請求父組件攔截
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
32、實現新聞頭條的標題和小圓點
if (topnews != null) {
mViewPager.setAdapter(new TopNewsAdapter());
indicator.setViewPager(mViewPager);
indicator.setSnap(true);
indicator.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
TopNews topNews = topnews.get(position);
tvTitle.setText(topNews.title);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
33、解決頁面銷毀後重新初始化時,Indicator仍然保留上次原點位置的bug
indicator.onPageSelected(0);// 默認第一個選中
34、listview設置新聞內容的適配器實現(常用熟記)
/**
* 列表listview適配器
*/
class NewsAdapter extends BaseAdapter {
public NewsAdapter() {
bitmapUtils = new BitmapUtils(mActivity);
}
private ViewHolder holder;
private BitmapUtils bitmapUtils;
@Override
public int getCount() {
return newsList.size();
}
@Override
public NewsData 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) {
if (convertView != null) {
convertView = View.inflate(mActivity, R.layout.list_item_news,
null);
holder = new ViewHolder();
holder.ivIcon = (ImageView) convertView
.findViewById(R.id.iv_icon);
holder.tvDate = (TextView) convertView
.findViewById(R.id.tv_date);
holder.tvTitle = (TextView) convertView
.findViewById(R.id.tv_title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
NewsData newsData = newsList.get(position);
holder.tvTitle.setText(newsData.title);
holder.tvDate.setText(newsData.pubdate);
bitmapUtils.display(holder.ivIcon, newsData.listimage);
return convertView;
}
}
static class ViewHolder {
public ImageView ivIcon;
public TextView tvTitle;
public TextView tvDate;
}
35、listview裡面的標題設置兩行,後面加上省略號
android:ellipsize="end"
android:maxLines="2"
36、listview滑動的時候會出現黑色:原因,緩衝的時候有時候會載入出黑色
在listview布局文件設置白色android:cacheColorHint="#fff"
36、listview滑動只是局部滑動,要全屏滑動
整個設置為listview,viewpager作為頭部局載入進來
37、下拉刷新主要實現代碼
private void initHeaderView() {
mHeaderView = View.inflate(getContext(),
R.layout.pull_to_refresh_header, null);
tvTitle = (TextView) mHeaderView.findViewById(R.id.tv_title);
tvDate = (TextView) mHeaderView.findViewById(R.id.tv_time);
av_arrow = (ImageView) mHeaderView.findViewById(R.id.iv_arrow);
progressBar = (ProgressBar) mHeaderView.findViewById(R.id.pb_loading);
this.addHeaderView(mHeaderView);
// 隱藏頭布局
mHeaderView.measure(0, 0);
measuredHeight = mHeaderView.getMeasuredHeight();
mHeaderView.setPadding(0, -measuredHeight, 0, 0);
initAnima();
}
/**
* 初始化旋轉動畫
*/
private void initAnima() {
// 鬆開刷新
rotateUp = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateUp.setDuration(200);
rotateUp.setFillAfter(true);
// 下拉刷新
rotateDown = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateDown.setDuration(200);
rotateDown.setFillAfter(true);
}
/**
* 下拉刷新
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
if (startY == -1) {// 當按到viewpager進行下拉的時候,ACTION_DOWN會被消費掉,所以需要重新賦值
startY = (int) ev.getY();
}
if(mCurrentState==START_REFRESHING){//正在刷新,挑出循環
break;
}
int endY = (int) ev.getY();
int dy = endY - startY;// 偏移量
int firstVisiblePosition = getFirstVisiblePosition();// 顯示第一個item的位置
if (dy > 0 && firstVisiblePosition == 0) {
int padding = dy - measuredHeight;// 設置下拉padding值
mHeaderView.setPadding(0, padding, 0, 0);
if (padding > 0 && mCurrentState != START_TO_RELEASE_REFRESH) {
mCurrentState = START_TO_RELEASE_REFRESH;
// 改為鬆開刷新
refreshState();
} else if (padding
&& mCurrentState != START_TO_PULL_REFRESH) {
mCurrentState = START_TO_PULL_REFRESH;
// 改為下拉刷新
refreshState();
}
}
break;
case MotionEvent.ACTION_UP:
startY=-1;
if(mCurrentState==START_TO_RELEASE_REFRESH){
mCurrentState=START_REFRESHING;
refreshState();
//完整顯示頭布局
mHeaderView.setPadding(0, 0, 0, 0);
}else {
//隱藏頭布局
mHeaderView.setPadding(0, -measuredHeight, 0, 0);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
private void refreshState() {
switch (mCurrentState) {
case START_TO_PULL_REFRESH:// 下拉刷新
tvTitle.setText("下拉刷新");
av_arrow.startAnimation(rotateDown);
progressBar.setVisibility(View.INVISIBLE);
av_arrow.setVisibility(View.VISIBLE);
break;
case START_TO_RELEASE_REFRESH:// 鬆開刷新
tvTitle.setText("鬆開刷新");
av_arrow.startAnimation(rotateUp);
progressBar.setVisibility(View.INVISIBLE);
av_arrow.setVisibility(View.VISIBLE);
break;
case START_REFRESHING:// 正在刷新
tvTitle.setText("正在刷新...");
av_arrow.clearAnimation();
progressBar.setVisibility(View.VISIBLE);
av_arrow.setVisibility(View.INVISIBLE);
break;
default:
break;
}
}
38、TabDetailPager怎麼知道正在刷新
在PullToRefreshListView裡面寫一個回調介面
//5、在TabDetailPager刷新數據
lvList.setOnrefresh(new OnRefreshListenter() {
@Override
public void onRefresh() {
getDataFromServer();
}
});
// 4、在case MotionEvent.ACTION_UP:進行回調
if (mListenter != null) {
mListenter.onRefresh();
}
// 3、定義成員變數來接收監聽對象
private OnRefreshListenter mListenter;
// 2、暴露一個方法調用介面
public void setOnrefresh(OnRefreshListenter listenter) {
mListenter = listenter;
}
// 1、定義下拉 回調介面
public interface OnRefreshListenter {
public void onRefresh();
}
39、設置刷新時間
/**
* 設置刷新時間
*/
public void setCurrentTime(){
SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sDateFormat.format(new Date());
tvDate.setText(time);
}
40、滑到底部載入更多
先初始化底部布局
/**
* 初始化腳布局
*/
private void initFootView() {
View mFootView = View.inflate(getContext(),
R.layout.pull_to_refresh_footer, null);
mFootView.measure(0, 0);
int mFootHeight = mFootView.getMeasuredHeight();
mFootView.setPadding(0, -mFootHeight, 0, 0);
}
然後在listview設置監聽事件implements OnScrollListener
// 滑動狀態發生變化
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
private boolean isLoadMore;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {
int lastPosition = getLastVisiblePosition();
if (lastPosition == getCount() - 1 && !isLoadMore) {
mFootView.setPadding(0, 0, 0, 0);
setSelection(getCount() - 1);
if(mListenter!=null){
mListenter.onLoadMore();
}
}
}
}
getMoreDataFromServer裡面的代碼跟第一次一樣,只不過把url改成第二頁的
processData(String result,boolean isMore)加入一個boolean參數進行判斷
if(true){
newsList.addAll(moreDatas);//把數據追加到原來的集合里
}
41、listview的點擊事件:position-2是因為一個下拉刷新頭布局和viewpager佔了兩個位置
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View arg1,
int position, long arg3) {
int headerViewsCount = lvList.getHeaderViewsCount();//獲取頭布局數量
position=position-headerViewsCount;
}
});
42、已讀未讀實現
lvList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View view,
int position, long arg3) {
int headerViewsCount = lvList.getHeaderViewsCount();//獲取頭布局數量
position=position-headerViewsCount;
NewsData news = newsList.get(position);
//標記疊加
String read_ids = PrefUtils.getString(mActivity, "read_ids", "");
if(!read_ids.contains(news.id+"")){//防止多次標記
read_ids=read_ids+news.id;
PrefUtils.setString(mActivity, "read_ids", read_ids);
}
//拿到view對象,就可以拿到TextView標題的對象,從而改變顏色
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
tvTitle.setTextColor(Color.GRAY);
}
});
重新載入進來也要顯示已讀
在NewsAdapter適配器的getview方法判斷標記id
//根據本地記錄標記已讀未讀
String read_ids = PrefUtils.getString(mActivity, "read_ids", "");
if (read_ids.contains(newsData.id + "")) {
holder.tvTitle.setTextColor(Color.GRAY);
} else {
holder.tvTitle.setTextColor(Color.BLACK);
}
43、activity一定是全屏的,所以新聞listview詳情頁用activity
44、webview的使用
WebSettings settings = mWebView.getSettings();// 得到webview 的設置
settings.setBuiltInZoomControls(true);// 放大縮小
settings.setUseWideViewPort(true);// 支持雙擊放大縮小
settings.setJavaScriptEnabled(true);// 支持js功能
mWebView.setWebViewClient(new WebViewClient() {// 設置在本項目打開對話窗口
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pbLoadingBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
pbLoadingBar.setVisibility(View.INVISIBLE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
45,兩個activity傳遞值
//跳轉頁面:設置值
Intent intent = new Intent(mActivity, NewsDetailActivity.class);
intent.putExtra("url", news.url);
mActivity.startActivity(intent);
//d得到值
String mUrl = getIntent().getStringExtra("url");
mWebView.loadUrl(mUrl);
46、分享實現代碼
TAG:別拿暗戀當酒喝 |