編輯:關於Android編程
在手機應用中,以列表或者網格的形式展示元素是一個非常重要的模式。用戶可以看到條目(item)的集合並且可以滾動他們。這個條目的集合可以是一個列表、一個網格或者是代表數據的其他的結構。就像如下的圖片:
用戶通過觸摸時間或者是工具欄和這些條目的集合進行交互。每一個條目都可以被選中。選中這個條目可能會顯示詳情或者是更新工具欄。如下圖:
RecyclerView類就是用來支持顯示數據集合的。
這是一個有安卓系統提供的,現在化的ListView和GridView版本。RecyclewView處理了之前空間所存在的問題。它強制了一種編碼風格可以讓結果有一種好的表現形式。並且它為增加或者刪除元素提供了默認的動畫。
RecyclerView 允許不同的布局去顯示不同的條目。
ReclclerView使用ViewHolder去存儲view的引用。 一個ViewHolder類是一個adapter裡的靜態內部類,維持了不同view的引用。使用這些引用可以省去findViewById()所花費的時間。
一個Adapter負責管理數據模型,並且把它適配到個子的實體。它集成自RecyclerView.Adapter,並且通過RecyclerView.setAdapter方法分配到指定的recycler view。適配器的輸入可以是任意的java類,但必須通過getItemCount()返回條目的個數。
適配器為不用的元素填充布局。在onCreateViewHolder 這個方法之後這項活就完成了。每當有一個實體在RecyclerView中可見,這個函數就返回一個ViewHolder 對象。
這個實例被用作訪問在被填充的布局中的視圖。onCreateViewHolder 方法只有在新的視圖必須被創建的時候才會調用。
每一個可見狀態的實體都會通過適配器被填入正確的數據模型。一旦數據條目變得課件,適配器就會為剛剛填充的控件指派何時的數據。這項工作由onBindViewHolder 方法完成。
舉個例子,一個列表的實體有可能是這樣的:嘴邊有一個圖片,中間由兩個文字。比如這樣:
布局文件<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
android:contentDescription="TODO"
android:src="@drawable/ic_launcher" />
RecyclerView是單獨的控件,在API7+中可以使用,在Gradle中加入依賴
dependencies { ... compile "com.android.support:recyclerview-v7:23.0.1" }
layout manager 決定了數據在RecyclerView中如何戰術。RecyclerView庫提供了如下的manager;
LinearLayoutManager 展示了水平或者垂直的滾動列表 GridLayoutManager 在網格中展示條目 StaggeredGridLayoutManager 在挫列的網格中展示條目觸摸事件,比如說點擊,應該在recycler view中被view處理。如果觸發了其他對象(比如說activity或者fragment),你應該通過adapter的構造方法傳遞進來,這樣允許adapter存儲對象的引用,然後調用它的方法(回調函數)
adapter需要為每一行條目創建布局,根布局一般是ViewGroup (layout manager),包含了很多view,比如說ImageView 或者TextView,下圖是奇偶行顯示不同的效果
getItemViewType 方法可以讓 recycler view 去決定哪一種應該被對象使用。如果這個類型需要的話,框架會子的自動調用onCreateViewHolder 。在 onCreateViewHolder 方法中,你應該填充正確的布局並且返回一個合適的view holder。
想要自定義動畫需要繼承RecyclerView.ItemAnimator並且調用RecyclerView.setItemAnimator() 方法,
需要在adapter中處理邏輯。
notifyItemInserted(position)在增加一條數據的時候可以通知view去把它加入到何時的位置。
notifyItemRemoved(position)在刪除的時候可以通知,
最終目標
布局文件
提示:ImageView有android:elevation屬性,會讓安卓畫一個陰影,
沒一個條目的布局文件
創建如下的類
package com.vogella.android.recyclerview; import java.util.ArrayList; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; public class MyAdapter extends RecyclerView.Adapter{ private ArrayList mDataset; // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView txtHeader; public TextView txtFooter; public ViewHolder(View v) { super(v); txtHeader = (TextView) v.findViewById(R.id.firstLine); txtFooter = (TextView) v.findViewById(R.id.secondLine); } } public void add(int position, String item) { mDataset.add(position, item); notifyItemInserted(position); } public void remove(String item) { int position = mDataset.indexOf(item); mDataset.remove(position); notifyItemRemoved(position); } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(ArrayList myDataset) { mDataset = myDataset; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element final String name = mDataset.get(position); holder.txtHeader.setText(mDataset.get(position)); holder.txtHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { remove(name); } }); holder.txtFooter.setText("Footer: " + mDataset.get(position)); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return mDataset.size(); } }
Activity
public class MyActivity extends Activity { private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView mRecyclerView.setHasFixedSize(true); // use a linear layout manager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); // specify an adapter (see also next example) mAdapter = new MyAdapter(myDataset); mRecyclerView.setAdapter(mAdapter); } ... }
和Android UI layout一樣,我們也可以在XML中定義應用程序的菜單。通過在菜單的onCreateOptionsMenu方法中膨脹菜單layout。這樣做會使
本文實例講述了Android手機鬧鐘用法。分享給大家供大家參考。具體如下:一、開發手機鬧鐘主要用到了AlarmManager類,AlarmManager類提供了訪問系統定
最近,華為的新機可以說是不斷湧出,這不,剛剛發布了由吳亦凡代言的榮耀8新機,隨之又發布了華為麥芒5,那麼有很多朋友都在問,麥芒5和榮耀8哪個好?麥芒5和榮耀
首先分析下游戲界面內的元素:無限滾動的背景圖, 可以操作的主角,主角的子彈, 主角的血量,兩種怪物(敵機),一個boss, boss的爆炸效果.先看效果圖1、首先實現無限