天天看點

RecyclerView知識點小解<pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;"> RecyclerView知識點小解

<pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;">
           

RecyclerView知識點小解

  在現在的App中, 到處可見RecyclerView的身影, 幾乎已經把傳統的ListView給疊代更新掉了。    由此可見該元件的重要性。  這篇文章主要就是把RecyclerView的基本知識點給講解一下,  已經如何使用RecyclerView。

      一、注意

   該元件是Android超級庫裡面的, 想要使用需要先把該元件導入工程,本人用的IDE是Android Studio, 最好大家不要采用Eclipse進行開發,    因為Google之前在Eclipse寫的ADT太老了。 就算你引用了該元件的JIRA, 編譯的時候它也帶入不進去。

  二、導入

   在目前工程的Window找到   File --> Project Structure...會彈出一個新視窗, 點選左邊的app --> Dependencies --> '+'(加号) -->     選第一個 --> 找到你要的RecyclerView元件點選OK即可、    因為大多人都知道怎麼導入的, 為了友善就不上圖檔版的嘞。

三、與傳統的ListView進行比較

   傳統的ListView在進行視圖複用中并沒有硬性要求, 你可以進行視圖緩存, 也可以不進行。    但是RecyclerView就提供了一個類為RecyclerView.ViewHolder.  你必須按照視圖緩存方式進行處理。    定制Item視圖項, ListView隻能實作垂直性排列的清單視圖, 然而RecyclerView則是通過RecyclerView.LayoutManager進行展示,     隻要你能寫的出, 就沒有辦不到的視圖呈現方式。  (單單就這一點就可以吧ListView給舍棄了)       Item動畫, 還記得在ListView中寫動畫的時候需要考慮的複雜因素, 而且ListView也沒有提供任何友善開發者的接口,    相反的, 可以通過RecyclerView.ItemAnimator來設定每個條目的展示動畫。         擴充卡,  在ListView中有太多的Adapter告訴開發者, 遊标擴充卡、 基本擴充卡... 太多了, RecycerView就可以讓我們開發自己提供    資料集, RecyclerView.Adapter。  這樣就可以不需要管那麼多Adapter該用什麼好了。(我學習ListView的時候, 被這個搞破了腦子)    設定每個Item條目的分割線, ListView中可以設定android:driver屬性來控制每個Item可有的分割線, RecyclerView提供了    Recycler.ItemDecoration來控制每個條目的分割效果。(我基本上都是直接采用每個Item的margin或padding的方式進行分割)    Item點選事件, ListView可以直接設定OnItemClickListener方法, 在RecyclerView就可以設定OnItemTouchListener。  明顯RecyclerView可以    進行的邏輯操作更多。

    四、 基礎知識點

      RecyclerView.Adapter扮演者重要的角色, 一般我們着重重寫他的兩個方法。onCreateViewHolder, onBindViewHolder。   public ViewHolder onCreateViewHolder(...)建立Item視圖, 并傳回響應的ViewHolder   public void onBindViewHolder(....)  綁定目前Item的視圖展示項。   RecyclerView.LayoutManager 負責Item的展示, 以及何時回收。  每個RecyclerView必須指定一個LayoutManager, 否則會抛出異常。   LinearLayoutManager :  水準或者垂直的Item視圖。   GridLayoutManager: 網格Item視圖 StaggereGridLayoutManager交錯的網格Item視圖。 當然還有一些很實用的API:

findFirstVisibleItemPosition()

傳回目前第一個可見Item的position

findFirstCompletelyVisibleItemPosition()

傳回目前第一個完全可見Item的position

findLastVisibleItemPosition()

傳回目前最後一個可見Item的position

findLastCompletelyVisibleItemPosition()

傳回目前最後一個完全可見Item的position

五、使用

<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends Activity {

    private RecyclerView mRecyView;
    private List<String> mDatas;
    private MyRecyclerViewAdapter mRecyViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDatas();

        mRecyViewAdapter = new MyRecyclerViewAdapter(this, mDatas);
        mRecyView.setAdapter(mRecyViewAdapter);
        mRecyView.setLayoutManager(new GridLayoutManager(this, 2));
    }

    private void initDatas() {
        mDatas = new ArrayList<String>();

        mDatas.add(0, "Android");
        mDatas.add(1, "IOS");
        mDatas.add(2, "Java");
        mDatas.add(3, "C");
        mDatas.add(4, "C++");
        mDatas.add(5, "C#");
        mDatas.add(6, "HTML");
        mDatas.add(7, "CSS");
        mDatas.add(7, "JavaScript");

    }

    private void initView() {
        mRecyView = (RecyclerView) this.findViewById(R.id.main_recy_view);
    }
}</span>
           
<span style="font-family:Microsoft YaHei;font-size:14px;">public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private Context mContext;
    private List<String> mDatas;
    private LayoutInflater mLayoutInflater;

    public MyRecyclerViewAdapter(Context ctx, List<String> datas){
        this.mContext = ctx;
        this.mDatas = datas;
        mLayoutInflater = LayoutInflater.from(mContext);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(mLayoutInflater.inflate(R.layout.main_recy_view_layout, parent, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTv.setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private TextView mTv;
        public ViewHolder(View itemView) {
            super(itemView);

            mTv = (TextView) itemView.findViewById(R.id.main_recy_view_tv);
            mTv.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id){
                case R.id.main_recy_view_tv:
                    Toast.makeText(mContext, ((TextView) v).getText().toString(), Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }
}</span>
           

運作效果:

RecyclerView知識點小解&lt;pre name="code" class="java" style="font-size: 24px; font-weight: bold; text-align: center;"&gt; RecyclerView知識點小解

大家可切換不同的LayoutManager進行檢視效果。