實現一個Android電子書閱讀APP
http://www.cnblogs.com/xfangs/
歡迎在本文下方評論,小方很需要鼓勵支持!!!
本系列教程僅供學習交流
小說閱讀器最終實現效果見 第一篇博文
前言
在上一篇文章中,我們實現了ViewPager的基本功能,按照計劃,製作咱們的電子書閱讀app需要使用ViewPager插入兩頁視圖,一個用來顯示當前書架,一個用來展示不同的分類。這一節,我們將在被標記為find的頁面上實現分類選項。
涉及組件或框架:RecyclerView、Glide
首先·布局
同樣的,在這裡,小方因為水平有限只能簡單介紹RecyclerView的基本使用方法,涉及到更深奧的操作部分,就無能為力了。
1 android:id="@+id/recyler_view_find_book" android:layout_margin="8dp" android:layout_width="match_parent"
2
5
6
android:layout_height="match_parent"/>
沒有複雜的步驟,我們只需要把RecyclerView加入到之前ViewPager的兩個布局之一中,就完成了整個列表布局。
當然,你也許會遇到一些意外。
這是說明我們還沒有引入RecyclerView這個庫,進入Design界面,從左邊的組件中找到RecyclerView,單擊,將會彈出選擇框。
在加入了庫之後,我們就能看到RecyclerView正確無誤的顯示在界面上了。
適配器
這次我們工作的主戰場在上一節提到的Fragment,也就是ViewPager的兩個頁面之一。
回顧一下代碼。
1 public static class FindBooksFragment extends Fragment {
2
3 public FindBooksFragment {
4 }
5
6 @Override
7 public View onCreateView(final LayoutInflater inflater, ViewGroup container,
8 Bundle savedInstanceState) {
9
10 View rootView = inflater.inflate(R.layout.pager_book_find, container, false);
11
12 return rootView;
13 }
14
15 }
之前說了,ViewPager會在創建這個頁面的時候調用onCreateView這個函數,所以我們在這裡進行初始化操作。
在這之前,我們需要先完成RecyclerView的適配器,同樣的,這裡適配器起到將數據和頁面結合到一起的作用,具體地說,假設一個列表中的項目可以分為三類,我們就為這三類元素分別設計布局,然後將每一項的數據傳給適配器,適配器可以根據數據選擇對應的布局,然後把每一項顯示出來。
首先,新建一個類。
關於RecyclerView的適配器,網路上已經有很多博客描述了, 隨意找一篇看的過去的文章,先大體了解一下。
。。。搜索時間。。。
了解過後,我們知道需要為列表項寫布局,這在前面也間接提到了。
那麼,新建一個布局文件
book_find_item.xml
1
2
tools:src="@color/cardview_dark_background"
tools:text="123"
在這裡,我們又使用了一個新的組件,CardView,它體現了安卓最新設計風格,恰到好處的圓角、逼真的陰影、點擊特效、等等,有多種屬性可供調整。
尤其要說的是上面代碼中加粗的字體,一個新的命名空間 tools ,在使用它之前,我們首先要在最外層的部件上聲明。
只要打出前面幾個字母,android studio 就會自動補全好。
tools 命名空間提供了測試的效果,以他為名號的屬性在程序運行期間是被忽略的,只供測試預覽使用,使得開發更加方便了。下圖就是我們預覽時得到的效果,
當程序運行起來時, 還會是如圖所示的樣子嗎?
(必然不是)
製作好了布局文件,我們就可以開始對適配器進行編寫了。
首先製作一個介面,用來獲取點擊事件。
1 private OnItemClickListener listener;
2
3 public void setOnItemClickListener(OnItemClickListener listener) {
4 this.listener = listener;
5 }
6
7 public interface OnItemClickListener {
8 void onItemClick(View view, int position);
9 void onItemLongClick(View view, int position);
10 }
然後在適配器的類中再新建一個類。
1 static class ViewHolder extends
RecyclerView.ViewHolder
View.OnClickListener, View.OnLongClickListener
可能略顯複雜,這個類的作用是緩存列表項,具體比較低層的東西小方就不太清楚了,上網搜了搜,就不現學現賣了,歡迎有興趣的同學一起討論。
ViewHolder 類繼承自 RecyclerView.ViewHolder,為了實現點擊監聽,還要接入兩個介面,一個是單擊的介面,一個是長按的介面。
從構造函數開始一點一點理解,構造函數接收兩個參數,一個是每一項的View,一個是每一項的點擊監聽器。初始化組件之後,設置監聽器,按照之前設置的介面的設定,將View和位置傳給借口。
如果還不是很清楚,那麼先將代碼複製過去,使用次數多了,自然就理解了。
然後,在AdapterBookFind這個類中,完成它的構造函數,這裡是根據需要自行設定的,在這裡我們需要將分類名稱傳給適配器,顯示在每一項上,所以傳送了一個字元串列表。你也可以根據自己的需要傳送想要傳送的數據。
1 private ArrayList 下面我們需要重寫一個函數,用來獲取一個ViewHolder的實例。 1 private Context context; context = parent.getContext; 在這裡,我們又聲明了一個叫做context的變數,並初始化,具體作用後面再表。 1 @Override 類似ViewPager的適配器一樣,我們同樣需要重寫取數目的函數,根據數據返回一個值。 馬上就到最後一步了,我們將要對列表的每一項設置不同的內容。 1 @Override holder.textview_bookFindClass.setText(myCategory.get(position)); 因為我們的布局文件中只有兩個組件能體現數據的內容,TextView和ImageView。
2
3 public AdapterBookFind(ArrayList
4 this.myCategory = category;
5 }
2 public int getItemCount {
3 return myCategory.size;
4 }
2 public void onBindViewHolder(final ViewHolder holder, int position) {
3
第三行是根據不同的位置選擇不同的字元串進行設置,沒有難度。
在說switch之前,我們先來看最後一行
holder.imageView.setColorFilter(Color.parseColor("#55555555"));
給imageView設置濾色,因為我想要在圖片之上顯示一個白色的文字,適當的使圖片變暗,能凸顯文字。
switch當然也能看得懂,但是出現了一個陌生的東西 Glide。
實際不難理解,這個switch的作用還是根據不同的位置選擇不同的文件進行顯示,我們當然可以使用ImageView自帶的方法來設置圖片,但是ImageView只能設置本地或者APK之中的圖片資源,對於網路圖片或者諸多不支持的圖片類型(如GIF)就毫無辦法,不僅如此,當本地圖片較大時,還會不可避免的出現卡頓現象。
這時候Glide出現了,它能快速載入各種圖片,根據顯示大小自動對圖片進行壓縮,同樣一條語句,如果傳入圖片鏈接還能載入網路圖片,並緩存。
Glide.with(context).load(
R.mipmap.ic_launcher
如上面代碼所示的一句話,就能載入APK資源中的一張圖片,這裡我們只有圖標一個文件,所以將圖標文件傳給了imageView。
不過如果你只是把剛剛的代碼複製粘貼到你的工程,你的程序應該會報錯,顯示沒有找到Glide這個東西,這是因為Glide不是官方提供的,我們需要手動引入。
找到上面那個文件。
加入最後一行,選擇同步。
這樣,我們就引入了Glide。
整合
1 public static class FindBooksFragment extends Fragment { Log.e(TAG, "onItemClick: 111" ); Log.e(TAG, "onItemLongClick: 222" ); private static final String TAG = "FindBooksFragment"; 首先初始化我們的字元串列表。StaggeredGridLayoutManager是我們列表的布局管理器,安卓提供了三種布局管理器,用來實現不同的列表效果,多行列表,瀑布流列表,不同的滑動方向都可以進行設置,大家可以百度其他的布局管理器。 所以在27-30行,我們分別為RecyclerView設置了列表管理器和適配器,32行開始,為適配器設置點擊監聽器,咱們暫時不設置功能,使用log工具將其輸出在Android Monitor(log語句有快捷鍵)。
2
3 public FindBooksFragment {
4 }
5
6 private RecyclerView recyclerView;
7 private StaggeredGridLayoutManager staggeredGridLayoutManager;
8 private AdapterBookFind bookAdapterBookFind;
9
10 @Override
11 public View onCreateView(final LayoutInflater inflater, ViewGroup container,
12 Bundle savedInstanceState) {
13
14 final ArrayList
15 bookClass.add("//玄幻");
16 bookClass.add("//武俠");
17 bookClass.add("//都市");
18 bookClass.add("//歷史");
19 bookClass.add("//遊戲");
20 bookClass.add("//科幻");
21 bookClass.add("//女生");
22 bookClass.add("//所有");
23
24 View rootView = inflater.inflate(R.layout.pager_book_find, container, false);
25 recyclerView = (RecyclerView) rootView.findViewById(R.id.recyler_view_find_book);
26
27 staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
28 recyclerView.setLayoutManager(staggeredGridLayoutManager);
29 bookAdapterBookFind = new AdapterBookFind(bookClass);
30 recyclerView.setAdapter(bookAdapterBookFind);
31
32 bookAdapterBookFind.setOnItemClickListener(new AdapterBookFind.OnItemClickListener {
33 @Override
34 public void onItemClick(View view, int position) {
35
效果
運行程序,你將見到
我們又完成了新的一節,現在可以嘗試更換不同的圖片,嘗試使用網路圖片(不要忘記加入網路訪問許可權)。
未完待續...下一篇文章講述使用 litePal 完成書架,敬請期待!!!
※JVM類載入過程 & 雙親委派模型
※Java 的泛型擦除和運行時泛型信息獲取
※0基礎搭建Hadoop大數據處理-環境
※關於微信和支付寶自動退款介面的接入總結
TAG:達人科技 |
※Now Publishers FnT eBooks Library綜述類電子書帶你輕鬆搞科研
※Daily Post 三星電子
※新款Kindle Paperwhite電子書閱讀器升級了什麼?
※亞馬遜Kindle VS 掌閱iReader T6電子書閱讀器對比評測
※基於PyTorch重寫sklearn,《現代大數據演算法》電子書下載
※一面手機一面電子書 YotaPhone YOTA 3 評測體驗
※IPX8級防水 亞馬遜推出新Kindle Paperwhite電子書閱讀器
※亞馬遜電子書閱讀器Kindle Paperwhite全新上市
※TT電子收購Precision
※不一般的讀書樂趣 BOOX Note Pro電子書閱讀器評測
※不如iPhone8?LCD版iPhone X搭載A10芯,果粉:又一電子垃圾誕生
※沒時間看書?帶你體驗全新亞馬遜Kindle Paperwhite電子書閱讀器
※電子閱讀者的福音——Kindle Paperwhite電子閱讀器來了!
※Essential收購電子郵件初創企業CloudMagic
※復旦微電子選用新思科技DesignWare Bluetooth IP 解決方案
※亞馬遜更新煥彩Kindle Paperwhite電子書閱讀器
※MiLk Sofubi系列:低科技復古風「電子猿人」Electric Ape
※B&N發布NOOK GlowLight Plus電子書 採用更大的E-ink屏幕
※電子雙人組合YellowDoDoHomeland主題音樂現場
※DIY 一個 micropython 的多功能無線電子鐘