【吐槽】前陣子聽說google有中國開發者網站還以為英語渣渣的春天到了,誰知道API什么的還是英文的,只有很少一部分是中文的。
使用RecyclerView有幾個步驟:
在module的build.gradle中添加RecyclerView所在的依賴包
dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:25.1.0'//添加這一句,點擊sycn即可compile 'com.android.support:recyclerview-v7:25.1.0'}
在xml文件引進RecyclerView控件,就跟listView差不多,我貼上官方的demo(偷懶)
新建MyAdapter繼承RecyclerView.Adapter,除了要覆寫三個抽象方法外,還必須寫靜態內部類ViewHolder,RecyclerView的設計是強制要用ViewHolder的,以ViewHolder為單位對view進行緩存:
public class MyAdapter extends RecyclerView.AdapterViewHolder{private String[] mDataset;public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(TextView v) { super(v); mTextView = v; }}public MyAdapter(String[] myDataset) { mDataset = myDataset;}@Overridepublic MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false); //... ViewHolder vh = new ViewHolder(v); return vh;}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) { holder.mTextView.setText(mDataset[position]);}@Overridepublic int getItemCount() { return mDataset.length;}
里面將所有在item里頭需要用到的控件作為public的成員變量,就和ListView上的ViewHolder一樣; onCreateViewHolder() 方法用來為創建ViewHolder對象; onBindViewHolder() 方法將一個data上的數據寫入到一個ViewHolder對象中的view;RecyclerView內存優化的方式其實是,當一些item被滑動到屏幕外(不可見)時,將那些View對象回收給當前可見的item展示數據,這時就會調用onBindViewHolder() 方法重新給這些View對象加載新的data數據,從而避免了重新inflate View的較大內存開銷; getItemCount() 獲取data的個數
最后一步直接在代碼中為RecyclerView設置一個MyAdapter和其中要注意抽象類LayoutManager,LayoutManager官方給了三個實現類,分別實現list式排版(LinearLayoutManager)、girdView式排版(GridLayoutManager)和瀑布流式排版(StaggeredGridLayoutManager),前面兩個很簡單,所以就給出瀑布流排版的代碼:
public class MyActivity extends Activity {private RecyclerView mRecyclerView;private RecyclerView.Adapter mAdapter;private RecyclerView.LayoutManager mLayoutManager;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); //如果確保你的view大小不會改變,就可以使用這個方法提高效率 mRecyclerView.setHasFixedSize(true); //mLayoutManager = new LinearLayoutManager(this); //mLayoutManager = new GridLayoutManager(this,3); //從名字也看得出,它和網格布局有點像,第一個參數決定布局的列數,第一個參數表示豎向排列 mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new MyAdapter(myDataset); mRecyclerView.setAdapter(mAdapter); ...}}
設置MyAdapter的LayoutManager為StaggeredGridLayoutManager,這時候理論上已經是瀑布流的布局了,然而由于沒有給item設置不同高度,所以每個item度都是默認的一樣高,看起來和GridLayoutmanager并沒有什么差別。
在MyAdapter的onBindViewHolder中設置item的view的高度:
//一個放高度Integer的ArrayListArrayListheights = new ArrayList<>();@Overridepublic void onBindViewHolder(ViewHolder holder, int position) { //綁定數據的同時,修改每個ItemView的高度 ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); lp.height = heights.get(position); holder.mTextView.setText(mDataSet.get(position)); //其他操作 ...}
看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170121/92766.html
文章列表