android5.0中RecycleView的用法

jopen 8年前發布 | 28K 次閱讀 Android開發 移動開發

            最近學習了android5.0中新增的一個組件RecycleView,是用來代替當前的listview開發的,是因為在RecycleView中已經有了viewholder緩存,并且不同的item之間可以設置不同的布局。能非常有效地維護了意見數量有限,滾動大的數據集。使用 RecyclerView當你擁有的數據的集合,它的元素在運行時改變基于用戶行為和網絡事件的小部件

首先看看RecyclerView的一個小例子:

需要引入:android-support-v7-appcompat.jar

          android-v7-RecyclerView.jar來支持低版本的android系統

新建一個my_layout.xml布局文件:里邊放置一個RecyclerView

<android.support.v7.widget.RecyclerView
        android:id="@+id/rvlist"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        />

在之前的listview開發中,我們需要自定義viewholder來緩存listView中的數據,而在RecyclerView中,已經封裝好了viewholderadapter中,接下來自定義我們的adapter

public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
{
    // 數據集
    private String[] mDataset;

    public MyAdapter2(String[] dataset)
    {
        super();
        mDataset = dataset;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
    {

        // 創建一個View,簡單起見直接使用系統提供的布局,就是一個TextView

        View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);

        // 創建一個ViewHolder

        ViewHolder holder = new ViewHolder(view);

        return holder;

    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i)
    {

        // 綁定數據到ViewHolder上

        viewHolder.mTextView.setText(mDataset[i]);

    }

    @Override
    public int getItemCount()
    {

        return mDataset.length;

    }

    public static class ViewHolder extends RecyclerView.ViewHolder
    {

        public TextView mTextView;

        public ViewHolder(View itemView)
        {

            super(itemView);

//          mTextView = (TextView) itemView;
            mTextView = (TextView) itemView.findViewById(R.id.view_text_id);

        }

    }

}

activity這樣調用,并設置adapter

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist); 

         // 創建一個線性布局管理器 

         LinearLayoutManager layoutManager = new LinearLayoutManager(this); 

         layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

         // 設置布局管理器 

         recyclerView.setLayoutManager(layoutManager); 

         // 創建數據集 
         String[] dataset = new String[100]; 

         for (int i = 0; i < dataset.length; i++){ 

         dataset[i] = "item" + i; 

         } 

         // 創建Adapter,并指定數據集 

        MyAdapter2 adapter = new MyAdapter2(dataset); 

         // 設置Adapter 

         recyclerView.setAdapter(adapter); 

         }

運行效果:



在這個例子中只是用到了最基本的布局,下面結合android中新增的CardView和RecycleView實現一個復雜的布局:

先看效果圖:


CardView繼承自FrameLayout,允許你在card視圖中顯示信息. CardView也可以設置陰影和圓角。(其實現在很多應用都自定義了Card視圖,Google這回將card視圖作為基本控件,可以拿來直接使用了)

Layout中為CardView設置圓角使用card_view:cardCornerRadius屬性

代碼中為CardView設置圓角使用CardView.setRadius方法

為CardView設置背景顏色使用card_view:cardBackgroundColor屬性

1.在item布局中引入cardview組件

<android.support.v7.widget.CardView
        android:id="@+id/cardview_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cardCornerRadius="5dp"
        app:cardElevation="0dp" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="5dp" >

            <ImageView
                android:id="@+id/image_id"
                android:layout_width="20dp"
                android:layout_height="20dp" 
                android:layout_alignParentLeft="true"
                />

            <TextView
                android:id="@+id/text_id"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:textColor="#f89ef5"
                android:textSize="20dp"
                android:layout_centerInParent="true" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>

需要注意的是要在最底層的layout中引入cardview的命名空間:

xmlns:app=http://schemas.android.com/apk/res-auto

要實現不同的item有不同的布局,需要有一個type字段來作為區分,這里,我新建一個UserInfo類,如下:

public class UserInfo {

    public static final int hasImage = 1;
    public static final int noImage = 2;

    private String mUserName;
    private int userImage;

    int type;

    public String getmUserName() {
        return mUserName;
    }

    public void setmUserName(String mUserName) {
        this.mUserName = mUserName;
    }

    public int getUserImage() {
        return userImage;
    }

    public void setUserImage(int userImage) {
        this.userImage = userImage;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public UserInfo(String mUserName, int type) {
        this.mUserName = mUserName;
        this.type = type;
    }

    public UserInfo(String mUserName, int userImage, int type) {
        this.mUserName = mUserName;
        this.userImage = userImage;
        this.type = type;
    }
}

hasImage和noImage分別表示該item需不需要加載圖片,來加載不同的布局。

接下來看看Adapter的代碼:

public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{

    private List<UserInfo>mList = null;
    private Context context = null;

    public MyAdapter(List<UserInfo> mList, Context context) {
        super();
        this.mList = mList;
        this.context = context;
        //      for (int i = 0; i < mList.size(); i++) {
        //          Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
        //      }
    }

        public void addToList(UserInfo info,int position) {
            mList.add(0, info);
            notifyItemInserted(position);
            notifyDataSetChanged();
        }


    public class TextOnClick implements OnClickListener {
        private int position = 0;

        public TextOnClick(int position) {
            this.position = position;
        }


        @Override
        public void onClick(View v) {
            Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
        }
    }

    public class ImageOnclick implements OnClickListener {
        private int position = 0;

        public ImageOnclick(int position) {
            this.position = position;
        }
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
        }
    }

    public class ItemOnClick implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            Toast.makeText(context,"you choose the item",1000).show();
        }

    }



    @Override
    public int getItemCount() {
        return mList.size();
    }

    public class TextViewHolder extends RecyclerView.ViewHolder {
        public TextView textView = null;
        public TextViewHolder(View view) {
            super(view);
            this.textView = (TextView) view.findViewById(R.id.text_id);
        }
    }

    public class ImageTextViewHolder extends RecyclerView.ViewHolder {
        public ImageView imageView = null;
        public TextView textView = null;
        public ImageTextViewHolder(View view) {
            super(view);
            this.imageView = (ImageView) view.findViewById(R.id.image_id);
            this.textView = (TextView) view.findViewById(R.id.text_id);
        }



    }



    @Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        return mList.get(position).getType();
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
        case UserInfo.hasImage:
            ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
            imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
            imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
            imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
            imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
            break;
        case UserInfo.noImage:
            TextViewHolder textViewHolder = (TextViewHolder) holder;
            textViewHolder.textView.setText(mList.get(position).getmUserName());
            textViewHolder.textView.setOnClickListener(new TextOnClick(position));
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        ViewHolder holder = null;
        View view = null;
        switch (type) {
        case UserInfo.hasImage:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
            holder = new ImageTextViewHolder(view);
            break;
        case UserInfo.noImage:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
            holder = new TextViewHolder(view);
            break;
        }
<a target=_blank >源碼下載</a>
        return holder;
    }

}

在activity中這樣調用:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
        recyclerView.setHasFixedSize(true);

        LinearLayoutManager linaLayout = new LinearLayoutManager(this);
        linaLayout.setOrientation(1);

        recyclerView.setLayoutManager(linaLayout);

        recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);

        int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
                                  R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
                                  R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};

        List<UserInfo>userList = new ArrayList<UserInfo>();

        int position = 0;
        for (int i = 0; i < 35; i++) {
            position = (int) (Math.random() * 8);
            UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
            UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
            userList.add(userInfo1);
            userList.add(userInfo2);
        }

        final MyAdapter adapter= new MyAdapter(userList, this);
        recyclerView.setAdapter(adapter);

        recyclerView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MyActivity.this,"you choose the item",1000).show();
            }
        });

        Button button = (Button) findViewById(R.id.add);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
            }
        });

<a target=_blank >源碼下載</a>


 



來自: http://blog.csdn.net//mockingbirds/article/details/42245991

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!