Tra le nuove API Lollipop e anche nell'ultima versione della support library è disponibile questa view, altamente personalizzabile e che va oltre il semplice concetto di ListView o GridView.
RecyclerView permette infatti di ottenere praticamente tutte le configurazioni che desideriamo estendendo alcune classi.
Qui sotto un esempio di implementazione.
build.gradle
i
Queste due librerie vi permetteranno di utilizzare, come ovvio, le nuove API anche su dispositivi pre-lollipop
1
2dependencies {
3compile "com.android.support:appcompat-v7:21.0.+"
4compile 'com.android.support:recyclerview-v7:21.0.+'
5}
6
fragment_main.xml
i
Un semplice layout contenente solo la nostra RecyclerView
161
2
3<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4android:layout_width="match_parent"
5android:layout_height="match_parent"
6android:orientation="vertical">
7
8<android.support.v7.widget.RecyclerView
9android:id="@+id/list_article"
10android:layout_width="match_parent"
11android<img src="//static.androidiani.com/forum/images/smilies/emo_im_tongue_sticking_out.png" border="0" alt="" title="Stick Out Tongue" class="inlineimg" />addingTop="8dp"
12android:clipToPadding="false"
13android:layout_height="match_parent"/>
14
15</LinearLayout>
16
MyFragment.java
i
Non implemento tutto il codice relativo al fragment ma solo la parte che ci interessa per la configurazione iniziale della RecyclerView.
In questo caso specifico io vario la visualizzazione degli elementi in base all'orientazione del dispositivo.
La RecyclerView fondamentalmente si basa sull'utilizzo di LayoutManagers, per appunto, gestire la visualizzazione degli elementi.
In questo caso utilizzo un GridLayoutManager, definendo nel costruttore quante colonne dovrà avere la nostra RecyclerView(2);
Lo step successivo è definire lo SpanSizeLookup, una classe che andremo ad estendere e che sarà necessaria per stabilire quante colonne dovrà occupare la singola riga della lista (in questo caso 1 o 2) [vedi sotto]
161
2<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
3public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
4super.onCreateView(inflater, parent, savedInstanceState);
5View v = inflater.inflate(R.layout.list_article, parent, false);
6
7mList = (RecyclerView) v.findViewById(R.id.list_article);
8mList.setHasFixedSize(true);
9GridLayoutManager glm = new GridLayoutManager(getActivity(), 2);
10glm.setOrientation(GridLayoutManager.VERTICAL);
11glm.setSpanSizeLookup(new GridSpanSizeLookup(getActivity().getResources().ge tConfiguration()));
12mList.setLayoutManager(glm);
13
14return v;
15}
16
GridSpanSizeLookup.java
i
Volendo cambiare il tipo di visualizzazione in base al cambio di orientazione del dispositivo, nel costruttore della classe passo anche la configurazione del dispositivo e tramite un case statement ritorno il numero di colonne che il singolo elemento deve occupare.
221
2public class GridSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
3
4private Configuration mConfig;
5
6public GridSpanSizeLookup(Configuration config) {
7this.mConfig = config;
8}
9
10<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
11public int getSpanSize(int i) {
12switch(mConfig.orientation) {
13case Configuration.ORIENTATION_LANDSCAPE:
14return 1;
15case Configuration.ORIENTATION_PORTRAIT:
16return 2;
17default:
18return 2;
19}
20}
21}
22
MyViewHolder.java
i
Questa classe funziona quasi esattamente come quella che fino ad ora avevamo utilizzato nelle classiche ListView e GridView per questioni di performance.
201
2public class MyViewHolder extends RecyclerView.ViewHolder {
3
4public TextView title;
5public ImageView image;
6public TextView author;
7public TextView date;
8
9public MyViewHolder(View v) {
10super(v);
11title = (TextView) v.findViewById(R.id.title);
12image = (ImageView) v.findViewById(R.id.image);
13author = (TextView) v.findViewById(R.id.author);
14date = (TextView) v.findViewById(R.id.date);
15title.setTypeface(Typeface.createFromAsset(v.getCo ntext().getAssets(), "RobotoSlab-Light.ttf"));
16author.setTypeface(Typeface.createFromAsset(v.getC ontext().getAssets(), "RobotoSlab-Light.ttf"));
17date.setTypeface(Typeface.createFromAsset(v.getCon text().getAssets(), "RobotoSlab-Thin.ttf"));
18}
19}
20
MyAdapter.java
i
Il nostro adapter ora dovrà estendere RecyclerView.Adapter<T>. Il funzionamento è fondamentalmente il medesimo degli altri adapter (Es: BaseAdapter)
401
2public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
3
4private Context context;
5private ArrayList<Item> items;
6
7public ArticlesAdapter(Context c, ArrayList<Item> _items) {
8this.context = c;
9this.items = _items;
10}
11
12<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
13public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
14View v = LayoutInflater.from(viewGroup.getContext())
15.inflate(R.layout.my_list_row, viewGroup, false);
16return new MyViewHolder(v);
17}
18
19<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
20public void onBindViewHolder(final MyViewHolder myViewHolder, int i) {
21Item it = items.get(i);
22
23if(it.getImageLink() != null) {
24Picasso.with(context)
25.load(it.getImageLink())
26.fit()
27.centerCrop()
28.into(myViewHolder.image);
29}
30myViewHolder.author.setText(it.getAuthor());
31myViewHolder.title.setText(it.getTitle());
32myViewHolder.date.setText(dateConvert(it.getDate() ));
33}
34
35<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
36public int getItemCount() {
37return items.size();
38}
39}
40
MyFragment.java
i
Il modo di impostazione dell'adapter non cambia.
81
2<a rel="nofollow" href="https://www.androidiani.com/forum/members/override.html" target="_blank">Override</a>
3public void onActivityCreated(Bundle savedInstanceState) {
4super.onActivityCreated(savedInstanceState);
5mAdapter = new MyAdapter(getActivity(), items);
6mList.setAdapter(mAdapter);
7}
8
Buon coding![]()