文章出處

【吐槽】前陣子聽說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.Adapter {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;}
ViewHolder

里面將所有在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的ArrayListArrayList heights = 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

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()