當前位置:
首頁 > 最新 > 《智慧東莞》主要核心步驟代碼

《智慧東莞》主要核心步驟代碼

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:別拿暗戀當酒喝 |