新聞類APP模板詳解(android版)
阿新 • • 發佈:2019-02-03
其中, a. 顯示廣告的佈局檔案為ads_head.xml,用一個自定義ViewPager(AdsViewPager)來顯示滾動廣告。<span style="font-size:12px;">package com.latu.qingcheng123.adapter; import java.io.File; import java.util.ArrayList; import java.util.List; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageRequest; import com.latu.qingcheng123.R; import com.latu.qingcheng123.util.BaseTools; import com.latu.qingcheng123.util.GlobalParam; import com.latu.qingcheng123.util.ProfessionalTools; import com.latu.qingcheng123.vo.AdsItem; import com.latu.qingcheng123.vo.NewsItem; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Handler; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.Toast; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.TextView; public class NewsAdapter extends BaseAdapter { private Context mContext; // 新聞列表 private List<NewsItem> newsList; // 廣告列表 private List<AdsItem> adsList; private NewsViewHolder mHolder; private LayoutInflater mInflater; private ViewPager vpAds; private AdsAdapter adsAdapter; private TextView tvAdsTitle; private LinearLayout llAdsPage; private List<ImageView> ads_imageViews; // 滑動的圖片集合 private List<View> ads_dots; // 圖片標題正文的那些點 private int ads_currentItem = 0; // 當前圖片的索引號 public NewsAdapter(Context context, List<NewsItem> newsList, List<AdsItem> adsList) { super(); this.mContext = context; this.newsList = newsList; this.adsList = adsList; mInflater = LayoutInflater.from(mContext); ads_imageViews = new ArrayList<ImageView>(); ads_dots = new ArrayList<View>(); adsAdapter = new AdsAdapter(); } @Override public int getCount() { if (adsList != null && adsList.size() > 0) { if (newsList != null && newsList.size() > 0) { return newsList.size() + 1; } else { return 1; } } else { if (newsList != null && newsList.size() > 0) { return newsList.size(); } else { return 0; } } } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (adsList != null && adsList.size() > 0) { if (position == 0) { convertView = mInflater.inflate(R.layout.ads_head, null); tvAdsTitle = (TextView) convertView .findViewById(R.id.tv_ads_title); llAdsPage = (LinearLayout) convertView .findViewById(R.id.ll_ads_page); vpAds = (ViewPager) convertView.findViewById(R.id.vp_ads); vpAds.setAdapter(adsAdapter); vpAds.setOnPageChangeListener(new MyPageChangeListener()); // llAdsPage.removeAllViews(); // vpAds.removeAllViews(); ads_dots.clear(); ads_imageViews.clear(); for (int i = 0; i < adsList.size(); i++) { final AdsItem item = adsList.get(i); ImageView imageView = new ImageView(mContext); setImageViewPic(imageView, item.imgURL); imageView.setScaleType(ScaleType.CENTER_CROP); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, item.title, Toast.LENGTH_SHORT).show(); } }); ads_imageViews.add(imageView); View vDot = new View(mContext); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 10, 10); lp.setMargins(5, 0, 5, 0); vDot.setLayoutParams(lp); if (i == ads_currentItem) { vDot.setBackgroundResource(R.drawable.dot_focused); } else { vDot.setBackgroundResource(R.drawable.dot_normal); } llAdsPage.addView(vDot); ads_dots.add(vDot); } vpAds.setCurrentItem(ads_currentItem); tvAdsTitle.setText(adsList.get(ads_currentItem).title); return convertView; } else { convertView = mInflater.inflate(R.layout.news_list_item, null); mHolder = new NewsViewHolder(); mHolder.llCommon = (LinearLayout) convertView .findViewById(R.id.ll_common); mHolder.ivLeftImg = (ImageView) convertView .findViewById(R.id.iv_left_image); mHolder.tvTitle = (TextView) convertView .findViewById(R.id.tv_title); mHolder.tvSource = (TextView) convertView .findViewById(R.id.tv_source); mHolder.tvCommentCount = (TextView) convertView .findViewById(R.id.tv_comment_count); if (newsList != null && newsList.size() > position - 1) { NewsItem item = newsList.get(position - 1); mHolder.tvTitle.setText(item.title); mHolder.tvSource.setText(item.source); mHolder.tvCommentCount.setText("" + item.commentNum); setImageViewPic(mHolder.ivLeftImg, item.leftImgURL); } return convertView; } } else { convertView = mInflater.inflate(R.layout.news_list_item, null); mHolder = new NewsViewHolder(); mHolder.llCommon = (LinearLayout) convertView .findViewById(R.id.ll_common); mHolder.ivLeftImg = (ImageView) convertView .findViewById(R.id.iv_left_image); mHolder.tvTitle = (TextView) convertView .findViewById(R.id.tv_title); mHolder.tvSource = (TextView) convertView .findViewById(R.id.tv_source); mHolder.tvCommentCount = (TextView) convertView .findViewById(R.id.tv_comment_count); if (newsList != null && newsList.size() > position) { NewsItem item = newsList.get(position); mHolder.tvTitle.setText(item.title); mHolder.tvSource.setText(item.source); mHolder.tvCommentCount.setText("" + item.commentNum); setImageViewPic(mHolder.ivLeftImg, item.leftImgURL); } return convertView; } } // 切換當前顯示的圖片 private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (vpAds != null) { vpAds.setCurrentItem(ads_currentItem);// 切換當前顯示的圖片 } }; }; /** * 廣告滾動 */ public void scrollAds() { ads_currentItem = (ads_currentItem + 1) % ads_imageViews.size(); handler.obtainMessage().sendToTarget(); // 通過Handler切換圖片 } /** * 當ViewPager中頁面的狀態發生改變時呼叫 * */ private class MyPageChangeListener implements OnPageChangeListener { private int oldPosition = 0; /** * This method will be invoked when a new page becomes selected. * position: Position index of the new selected page. */ public void onPageSelected(int position) { ads_currentItem = position; tvAdsTitle.setText(adsList.get(position).title); ads_dots.get(oldPosition).setBackgroundResource( R.drawable.dot_normal); ads_dots.get(position) .setBackgroundResource(R.drawable.dot_focused); oldPosition = position; } public void onPageScrollStateChanged(int arg0) { } public void onPageScrolled(int arg0, float arg1, int arg2) { } } /** * 填充ViewPager頁面的介面卡 * */ private class AdsAdapter extends PagerAdapter { @Override public int getCount() { return ads_imageViews.size(); } @Override public Object instantiateItem(View arg0, int arg1) { ViewPager vp = (ViewPager) arg0; vp.addView(ads_imageViews.get(arg1)); return ads_imageViews.get(arg1); } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ViewPager vp = (ViewPager) arg0; vp.removeView((View) arg2); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } } private void setImageViewPic(final ImageView iv, String picUrl) { if (picUrl != null && !"".equals(picUrl)) { String picNameTemp = ProfessionalTools.MD5(picUrl); final String strFilePath = BaseTools.getImageCachePath(mContext) + File.separator + picNameTemp; File picFile = new File(strFilePath); if (picFile.exists()) // 本地有快取 { Bitmap bitmap = BaseTools.getLocalBitmap(strFilePath); if (bitmap != null) { iv.setImageBitmap(bitmap); } } else { ImageRequest imageRequest = new ImageRequest(picUrl, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { iv.setImageBitmap(response); BaseTools.saveBitmapInLocal(response, strFilePath); } }, 0, 0, Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { iv.setImageResource(R.drawable.loadpic_empty_listpage); } }); GlobalParam.g_volleyRequestQueue.add(imageRequest); } } } static class NewsViewHolder { LinearLayout llCommon; ImageView ivLeftImg; TextView tvTitle; TextView tvSource; TextView tvCommentCount; } } </span>
<span style="font-size:12px;"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fl_ads" android:layout_width="fill_parent" android:layout_height="wrap_content" > <com.latu.qingcheng123.widget.AdsViewPager android:id="@+id/vp_ads" android:layout_width="match_parent" android:layout_height="140dip" /> <LinearLayout android:layout_width="match_parent" android:layout_height="35dip" android:layout_gravity="bottom" android:background="#33000000" android:orientation="vertical" > <TextView android:id="@+id/tv_ads_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="2dip" android:textColor="#ffffff" /> <LinearLayout android:id="@+id/ll_ads_page" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="2dip" > </LinearLayout> </LinearLayout> </FrameLayout></span>
b. 顯示新聞的佈局檔案為news_list_item.xml,內容比較簡單,這裡就不貼了。 c. 廣告滾動是外部類CategoryFragment定時呼叫NewsAdapter的scrollAds()方法來實現的。 d. 廣告列表也有自身的adapter,AdsAdapter。 程式碼部分講到這裡,大夥可以下載工程原始碼進行研究!