編輯:關於Android編程
一.這一篇我們要從網絡為首頁加載數據,解析數據,並為各個組件設置數據。我們先來看看HomePage的代碼,邏輯後面分析。代碼看起雖然挺多的,邏輯卻沒有幾步。
public class HomeBasePage extends BasePage { private Gson mGson; private HomeDataBean mHomeData; private ListmLunboDatas = new ArrayList (); private List mListViewDatas = newArrayList (); private LunboAdapter mLunboAdapter; private int selectedPosition; private ListViewAdapter mListViewAdapter; private BitmapUtils mBitmapUtils; public HomeBasePage(MainActivity mainActivity) { super(mainActivity); // TODO自動生成的構造函數存根 } @Override public void initData(String themeDailyNumber) { // BitmapUtils類專門用來異步從網絡加載圖片 if (mBitmapUtils == null) { mBitmapUtils = new BitmapUtils(mainActivity); mBitmapUtils.configDefaultBitmapConfig(Config.ARGB_4444); } // 首頁顯示設置按鈕 ibSetting.setVisibility(View.VISIBLE); // 設置首頁標題 tvTitle.setText("首頁"); // 從網絡中加載數據 loadData(); } @Override protected void initListener() { vpLunboPic.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // 輪播圖一切換,拿到該頁面的position,傳給成員變量selectedPosition selectedPosition = position; // 為輪播圖設置標題並把該頁面對應的點從灰色變成白色 setTextAndSelectPoint(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO自動生成的方法存根 } @Override public void onPageScrollStateChanged(int arg0) { // TODO自動生成的方法存根 } }); // ListView的item一點擊,帶著該item的文章id去ArticleActivity lvNews.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // 因為ListView有個頭布局,而頭布局的position為0,頭布局不是文章item,所以position != 0 if (position != 0) { String url = MyContants.BASEARTICLESTRING + mHomeData.stories.get(position-1).id; Intent intent = new Intent(mainActivity,ArticleActivity.class); intent.putExtra("articleUrl", url); mainActivity.startActivity(intent); } } }); super.initListener(); } private void loadData() { mLunboAdapter = new LunboAdapter(); // 為輪播圖的ViewPager設置Adapter vpLunboPic.setAdapter(mLunboAdapter); mListViewAdapter = new ListViewAdapter(); // 為ListView設置Adapter lvNews.setAdapter(mListViewAdapter); // 先從SharedPreference裡面拿json數據 String jsonCache = SpTools.getString(mainActivity, MyContants.HOMELATEST, ""); // 如果數據存在,直接去解析Json數據 if (!TextUtils.isEmpty(jsonCache)) { // System.out.println(jsonCache); parseData(jsonCache); } HttpUtils httpUtils = new HttpUtils(); // 用HttpUtils異步從網絡獲取數據 // 第一個參數:get方式獲取數據 // 第二個參數:url地址 // 第三個參數:回調對象,獲取數據成功或獲取數據失敗後調用 httpUtils.send(HttpMethod.GET, MyContants.HOMELATEST, new RequestCallBack () { @Override public void onSuccess(ResponseInfo responseInfo) { // 獲取數據成功後,拿到json數據 String homeJsonData = responseInfo.result; // 這裡做一個緩存,把json數據保存到SharedPreference裡面 SpTools.putString(mainActivity,MyContants.HOMELATEST, homeJsonData); // System.out.println("Data" +homeJsonData); if (!TextUtils.isEmpty(homeJsonData) ) { parseData(homeJsonData); } } @Override public void onFailure(HttpException error, String msg) { // TODO自動生成的方法存根 } }); } private void parseData(String homeJsonData) { // 創建Gson對象,這個對象只要有一個就可以了,所以只有為空的時候才創建 if (mGson == null) { mGson = new Gson(); } // 用Gson解析數據 mHomeData = mGson.fromJson(homeJsonData, HomeDataBean.class); //System.out.println(mHomeData.stories.get(0).images.get(0)); // 處理數據 processData(); } private void processData() { // 1.給ViewPager數據 setLunboData(); // 2.初始化點 initLunboPoints(); // 3.設置標題及點的選中 setTextAndSelectPoint(); // 4.為ListView設置數據 setListViewData(); } private void setListViewData() { // 為ListView設置數據 mListViewDatas = mHomeData.stories; } private class ListViewAdapter extends BaseAdapter { @Override public int getCount() { return mListViewDatas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroupparent) { ViewHolder viewHolder; if (convertView == null) { // 加載ListView的item的布局 convertView = View.inflate(mainActivity, R.layout.list_item, null); viewHolder = new ViewHolder(); // 拿到item裡面的各個組件 viewHolder.textView = (TextView) convertView .findViewById(R.id.tv_list_item_title); viewHolder.imageView = (ImageView) convertView .findViewById(R.id.iv_list_item_image); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // 為item裡面的TextView組件設置標題 viewHolder.textView.setText(mListViewDatas.get(position).title); // 為item裡面的ImageView組件設置圖片,還是用BitmapUtils異步加載 String listImageUrl = mListViewDatas.get(position).images.get(0); if (!TextUtils.isEmpty(listImageUrl)) { mBitmapUtils.display(viewHolder.imageView, listImageUrl); } else { viewHolder.imageView.setVisibility(View.GONE); } return convertView; } } private class ViewHolder { TextView textView; ImageView imageView; } private voidsetTextAndSelectPoint() { // 設置輪播圖的標題 tvLunboTitle.setText(mHomeData.top_stories.get(selectedPosition).title); // 遍歷,輪播圖的setOnPageChangeListener的onPageChange方法中拿到了當前的頁面的position, // 並把它傳給selectedPosition,如果i為selectedPosition,則把點設為白點 for (int i = 0; i < mLunboDatas.size(); i++) { llLunboPoints.getChildAt(i).setEnabled(i == selectedPosition); } } private void initLunboPoints() { // 先移除輪播圖下面所有的點 llLunboPoints.removeAllViews(); // 遍歷輪播圖的數量,即有多少輪播圖,就創建幾個點 for (int i = 0; i < mLunboDatas.size(); i++) { View view = new View(mainActivity); // 為View設置背景,背景為一個選擇器,state_enabled為true的時候為白點,為false的時候為灰點 view.setBackgroundResource(R.drawable.selector_lunbo_points); // 默認都設為灰色點 view.setEnabled(false); // 為點View創建LayoutParams,裡面傳入的參數是px // 所以我們創建了一個工具類DensityUtil的dip2px()方法將density單位轉為像素單位px LayoutParams layoutParams = new LayoutParams(DensityUtil.dip2px( mainActivity, 5), DensityUtil.dip2px(mainActivity, 5)); // 為點View設置左邊邊距 layoutParams.leftMargin = DensityUtil.dip2px(mainActivity, 5); // 為點View設置LayoutParams view.setLayoutParams(layoutParams); // 把點加進LinearLayout llLunboPoints.addView(view); } } private class LunboAdapter extends PagerAdapter { @Override public int getCount() { return mLunboDatas.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO自動生成的方法存根 return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Objectobject) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { // 輪播圖的每一頁頁面都是一個ImageView ImageView imageView = new ImageView(mainActivity); // ImageView上面的圖片x軸,y軸上都拉伸 imageView.setScaleType(ScaleType.FIT_XY); // 用BitmapUtills從網上異步加載圖片,並放在ImageView容器中 // 第一個參數為容器 // 第二個參數為url mBitmapUtils.display(imageView, mHomeData.top_stories.get(position).image); // 輪播圖的ImageView一點擊,帶著該輪播圖頁面的文章id去ArticleActivity imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String url = MyContants.BASEARTICLESTRING + mHomeData.top_stories.get(vpLunboPic.getCurrentItem()).id; Intent intent = new Intent(mainActivity,ArticleActivity.class); intent.putExtra("articleUrl", url); mainActivity.startActivity(intent); } }); container.addView(imageView); return imageView; } } private void setLunboData() { // 拿到輪播圖的數據 mLunboDatas = mHomeData.top_stories; // 更新輪播圖的展示 mLunboAdapter.notifyDataSetChanged(); } }
二.我們現在來分析邏輯
過程上面已經有了,無非就是設置一些能設置的控件,需要從網絡拿的數據的過程就是,先從本地拿,本地沒有,再去網絡拿,然後就解析數據,然後用解析後的數據為輪播圖及ListView設置數據,輪播圖和ListView都用Adapter,過程也大同小異,前面都講過了。還是不會的話看代碼的注釋吧。
三.這裡我們專門來講一下怎樣用Gson來解析json數據
1)Gson包復制到libs目錄下面
2.從網上拿到json數據,放到HiJson軟件下面
3.在項目中專門創建一個bean包,專門放各種Bean類
4.以首頁數據為例,我們從網上拿到的數據是這樣的
5.接下去放到Hijson裡面格式化
6.根據結構創建HomeDataBean
public class HomeDataBean { public String date; public Liststories; public List top_stories; // ListView的數據 public class HomeListViewData { public String ga_prefix; public String id; public List images; public String title; public String type; public String multipic; } // 輪播圖的數據 public class HomeLunboData { public String ga_prefix; public String id; public String image; public String title; public String type; } }
7.創建Gson對象,調用Gson對象的fromJson方法解析
if (mGson == null) { mGson = new Gson(); } mHomeData = mGson.fromJson(homeJsonData, HomeDataBean.class);
1. 錯誤提示信息 錯誤大概意思:連接到adb(android debug bridge)出現了一個嚴重的錯誤,你必須重啟adb和Eclipse工具,請確保在位置…
Android-通過Java代碼來實現屬性動畫除了可以使用定義xml文件來設置動畫之外,還可以使用java代碼來進行控制動畫。示例如下:布局文件: 主活動:
ActionBar是3.0後的UI設計規范,同時也是Google極力推薦使用的設計風格,如何快速設計一個入眼的ActionBar呢,更進一步,給我們搭好一個入眼的Acti
在大多數的騷擾攔截類的軟件中都會有定時攔截這個實用的的功能,其實,也不難實現。 看圖: 在未選中啟用時間段時