您的位置:首頁>正文

實現一個Android電子書閱讀APP

http://www.cnblogs.com/xfangs/

歡迎在本文下方評論, 小方很需要鼓勵支援!!!

本系列教程僅供學習交流

小說閱讀器最終實現效果見 第一篇博文

前言

在上一篇文章中, 我們實現了ViewPager的基本功能, 按照計畫, 製作咱們的電子書閱讀app需要使用ViewPager插入兩頁視圖, 一個用來顯示當前書架, 一個用來展示不同的分類。 這一節, 我們將在被標記為find的頁面上實現分類選項。

涉及組件或框架:RecyclerView、Glide

首先·佈局

同樣的, 在這裡, 小方因為水準有限只能簡單介紹RecyclerView的基本使用方法,

涉及到更深奧的操作部分, 就無能為力了。

1 2 5 6

沒有複雜的步驟, 我們只需要把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

在這裡,我們又使用了一個新的元件,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 myCategory; 2 3 public AdapterBookFind(ArrayList category) { 4 this.myCategory = category; 5 }

下面我們需要重寫一個函數,用來獲取一個ViewHolder的實例。

1 private Context context; context = parent.getContext;

在這裡,我們又聲明了一個叫做context的變數,並初始化,具體作用後面再表。

1 @Override 2 public int getItemCount { 3 return myCategory.size; 4 }

類似ViewPager的適配器一樣,我們同樣需要重寫取數目的函數,根據資料返回一個值。

馬上就到最後一步了,我們將要對列表的每一項設置不同的內容。

1 @Override 2 public void onBindViewHolder(final ViewHolder holder, int position) { 3 holder.textview_bookFindClass.setText(myCategory.get(position));

因為我們的佈局檔中只有兩個元件能體現資料的內容,TextView和ImageView。

第三行是根據不同的位置選擇不同的字串進行設置,沒有難度。

在說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 { 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 bookClass = new 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 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語句有快速鍵)。

效果

運行程式,你將見到

我們又完成了新的一節,現在可以嘗試更換不同的圖片,嘗試使用網路圖片(不要忘記加入網路存取權限)。

未完待續...下一篇文章講述使用 litePal 完成書架,敬請期待!!!

關於RecyclerView的適配器,網路上已經有很多博客描述了, 隨意找一篇看的過去的文章,先大體瞭解一下。

。。。搜索時間。。。

瞭解過後,我們知道需要為清單項寫佈局,這在前面也間接提到了。

那麼,新建一個佈局檔

book_find_item.xml

1 2

在這裡,我們又使用了一個新的元件,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 myCategory; 2 3 public AdapterBookFind(ArrayList category) { 4 this.myCategory = category; 5 }

下面我們需要重寫一個函數,用來獲取一個ViewHolder的實例。

1 private Context context; context = parent.getContext;

在這裡,我們又聲明了一個叫做context的變數,並初始化,具體作用後面再表。

1 @Override 2 public int getItemCount { 3 return myCategory.size; 4 }

類似ViewPager的適配器一樣,我們同樣需要重寫取數目的函數,根據資料返回一個值。

馬上就到最後一步了,我們將要對列表的每一項設置不同的內容。

1 @Override 2 public void onBindViewHolder(final ViewHolder holder, int position) { 3 holder.textview_bookFindClass.setText(myCategory.get(position));

因為我們的佈局檔中只有兩個元件能體現資料的內容,TextView和ImageView。

第三行是根據不同的位置選擇不同的字串進行設置,沒有難度。

在說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 { 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 bookClass = new 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 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語句有快速鍵)。

效果

運行程式,你將見到

我們又完成了新的一節,現在可以嘗試更換不同的圖片,嘗試使用網路圖片(不要忘記加入網路存取權限)。

未完待續...下一篇文章講述使用 litePal 完成書架,敬請期待!!!

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示