Android RecyclerView與泛型 簡單實現多布局

RecyclerView簡介:

谷歌在support v7中,加入了新的控件——RecyclerView,該控件整合了ListView、GridView的特點,而且最大的優點是可以很方便實現瀑布流效果,多布局控制效果等等,因此RecyclerView受到越來越多的開發者重視。

引入RecyclerView

由于該控件并不在Andorid SDK中的,而是在support v7包中,因此我們要手動添加該控件。
在build.gradle中添加如下依賴:

dependencies {   
  ...
  compile 'com.android.support:appcompat-v7:23.1.1'  //Toolbar
  compile 'com.android.support:recyclerview-v7:23.1.1' //RecyclerView
}

幾個重要的類:

  1. RecyclerView.Adapter:抽象類,為RecyclerView提供數據,一般根據不同的業務需求來編寫具體的實現類。
  2. RecyclerView.LayoutManager:抽象類,主要用于測量RecyclerView的子Item,以及根據不同的布局方式來實現Item的布局效果,v7包自帶的實現類有:LinearLayoutManager、StaggeredGridLayoutManager、GridLayoutManager。
  3. RecyclerView.ItemDecoration:抽象類,這個主要用于不同的Item之間添加分割線(可選)。官方沒有實現類,所以如果要添加分割線,我們需要手動實現這個抽象類。
  4. RecyclerView.ItemAnimator:抽象類,這個主要用于當一個item添加或者刪除的時候出現的動畫效果,官方提供一個默認的實現類。如果想要使我們的RecyclerView在添加、刪除數據的時候有炫酷的動畫,可以實現這個抽象類。

使用RecyclerView的主要步驟:

  1. 引入RecyclerView
  2. 添加XML布局
  3. 封裝Adapter適配器
  4. 封裝RecyclerView.ViewHolder類
  5. 實現多布局展示
  6. 各布局控件監聽

注:在此主要實現三種不同布局加載,RecyclerView監聽及子布局監聽

MyAdapter類代碼

package com.example.administrator.foundationdemo.recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.example.administrator.foundationdemo.R;

import java.util.List;

/**
 * Created by "sinlov" on 2017/4/12.
 */
public abstract class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    private int mLayoutId;
    private Context mContext;
    private List<Data> mDataSet;

    /**
     * 構造器,接受數據集
     * @param data
     */
    public MyAdapter(Context context,List<Data> data){
        mContext = context;
        mDataSet = data;
    }

    /**
     * onCreateViewHolder:創建ViewHolder,
     * 該方法會在RecyclerView需要展示一個item的時候回調。
     * 重寫該方法時,應該使ViewHolder加載item view的布局。
     * 這個能發避免了不必要的findViewById操作,提高了性能。
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //加載布局文件
        switch (viewType){
            case ViewItems.TEMPLATE_1:
                break;
            case ViewItems.TEMPLATE_2:
                mLayoutId = R.layout.activity_recycler_view_recyclerview_item_my;

                break;
            case ViewItems.TEMPLATE_3:

                break;
            case ViewItems.TEMPLATE_4:
                break;
            case ViewItems.TEMPLATE_5:
                mLayoutId = R.layout.activity_recycler_view_recyclerview_item_ordinary_notification_1;
                break;
            case ViewItems.TEMPLATE_6:
                mLayoutId = R.layout.activity_recycler_view_recyclerview_item_ordinary_notification_2;
                break;
        }
        MyViewHolder holder = MyViewHolder.get(mContext,null,parent,mLayoutId);
        setListener(parent, holder);
        return holder;
    }

    /**
     * onBindeViewHolder:該方法在RecyclerView在特定位置展示數據時候回調,顧名思義,把數據綁定、填充到相應的item view中
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        //將數據填充到具體的view中
        convert(holder,mDataSet.get(position));
    }

    public abstract void convert(MyViewHolder holder, Data t);

    /**
     * 通過重寫getItemViewType(int position)方法來告訴onCreateViewHolder(...)每個條目對應的布局
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        return mDataSet.get(position).getViewType();
    }


    /**
     * getItemCount:返回數據的數量
     * @return
     */
    @Override
    public int getItemCount() {
        return mDataSet.size();
    }


    /**
     * java回調機制,依賴于子Item View的onClickListener及onLongClickListener。
     * @param <T> //數據類
     */
    public interface OnItemClickListener<T>{
        //RecyclerView監聽
        void onItemClick(ViewGroup parent, View view, T t, int position);
    }
    public interface OnItemLongClickListener<T>{
        //長按監聽
        boolean onItemLongClick(ViewGroup parent, View view, T t, int position);
    }

    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }

    protected void setListener(final ViewGroup parent, final MyViewHolder holder){
        //判斷是否設置了監聽器
        if(mOnItemClickListener != null) {
            //為ItemView設置監聽器
            holder.getConvertView().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(parent, v, mDataSet.get(position), position);
                }
            });
        }
        if(mOnItemLongClickListener != null){
            holder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if (mOnItemLongClickListener != null) {
                        int position = holder.getLayoutPosition();
                        return mOnItemLongClickListener.onItemLongClick(parent, v, mDataSet.get(position), position);
                        //返回true 表示消耗了事件 事件不會繼續傳遞
                    }

                    return false;
                }
            });
        }
    }
}

MyViewHolder類代碼:

package com.example.administrator.foundationdemo.recyclerview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by "sinlov" on 2017/4/13.
 */
public class MyViewHolder extends RecyclerView.ViewHolder {


    private SparseArray<View> mViews;
    private View mConvertView;
    private Context mContext;
    private int mLayoutId;

    public MyViewHolder(Context context, View itemView, ViewGroup parent) {
        super(itemView);
        //由于itemView是item的布局文件,我們需要的是里面的textView,因此利用itemView.findViewById獲
        //取里面的View實例,后面通過onBindViewHolder方法能直接填充數據到每一個View了
        mContext = context;
        mConvertView = itemView;
        //運用泛型,適配所有的View,多布局,不用寫多個RecyclerView.ViewHolder。
        mViews = new SparseArray<View>();
        mConvertView.setTag(this);

    }

    //緩存
    public static MyViewHolder get(Context context, View convertView,
                                 ViewGroup parent, int layoutId){

        if(null==convertView){
            View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false);
            MyViewHolder holder = new MyViewHolder(context, itemView, parent);
            holder.mLayoutId = layoutId;
            return holder;
        }else {
            MyViewHolder holder = (MyViewHolder) convertView.getTag();
            return holder;
        }
    }

    /**
     * 通過viewId獲取控件
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId)
    {
        View view = mViews.get(viewId);
        if (view == null)
        {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    public View getConvertView()
    {
        return mConvertView;
    }

    /**
     * 設置TextView的值
     *
     * @param viewId
     * @param text
     * @return
     */
    public MyViewHolder setText(int viewId, String text)
    {
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }

    public MyViewHolder setImageResource(int viewId, int resId)
    {
        ImageView view = getView(viewId);
        view.setImageResource(resId);
        return this;
    }

    public MyViewHolder setImageBitmap(int viewId, Bitmap bitmap)
    {
        ImageView view = getView(viewId);
        view.setImageBitmap(bitmap);
        return this;
    }

    public MyViewHolder setImageDrawable(int viewId, Drawable drawable)
    {
        ImageView view = getView(viewId);
        view.setImageDrawable(drawable);
        return this;
    }

    public MyViewHolder setBackgroundColor(int viewId, int color)
    {
        View view = getView(viewId);
        view.setBackgroundColor(color);
        return this;
    }

    public MyViewHolder setBackgroundRes(int viewId, int backgroundRes)
    {
        View view = getView(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }

    public MyViewHolder setTextColor(int viewId, int textColor)
    {
        TextView view = getView(viewId);
        view.setTextColor(textColor);
        return this;
    }

    public MyViewHolder setTextColorRes(int viewId, int textColorRes)
    {
        TextView view = getView(viewId);
        view.setTextColor(mContext.getResources().getColor(textColorRes));
        return this;
    }

    public int getDrawableId(String drawableName){
        int resId = mContext.getResources().getIdentifier(drawableName,"drawable",mContext.getPackageName());
       return resId;
    }

}

RecyclerViewActivity類代碼:

package com.example.administrator.foundationdemo.recyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.foundationdemo.R;

import java.util.ArrayList;
import java.util.List;

public class RecyclerViewActivity extends AppCompatActivity {


    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private List<Data> mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
        initData();
        initRecyclerView();
    }

    private void initData() {
        mData = new ArrayList<Data>();
        mData.add(new Data(1,"楓陽","recycler_my","FLY346422332","recycler_two"));
        mData.add(new Data(4,"相冊","recycler_photo"));
        mData.add(new Data(5,"收藏","recycler_collect"));
        mData.add(new Data(4, "錢包", "recycler_money"));
        mData.add(new Data(5, "卡包", "recycler_card"));
        mData.add(new Data(4, "表情", "recycler_expression"));
        mData.add(new Data(4, "設置", "recycler_install"));
    }

    private void initRecyclerView() {
        //1 實例化RecyclerView
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        //2 為RecyclerView創建布局管理器,這里使用的是LinearLayoutManager,表示里面的Item排列是線性排列
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        handlerRecyclerView();
        //3 設置數據適配器
        mRecyclerView.setAdapter(mAdapter);
    }

    private void handlerRecyclerView() {
        mAdapter = new MyAdapter(this, mData) {
            @Override
            public void convert(MyViewHolder holder, Data data) {
                switch (data.getViewType()){
                    case ViewItems.TEMPLATE_2:
                        handlerTemplate2(holder,data);
                        break;
                    case ViewItems.TEMPLATE_5:
                        handlerTemplate5(holder,data);
                        break;
                    case ViewItems.TEMPLATE_6:
                        handlerTemplate6(holder,data);
                        break;
                    default:
                        Log.d("FLY","錯誤了");
                        break;
                }
            }
        };

        mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(ViewGroup parent, View view, Object o, int position) {
                Data data = (Data) o;
                Toast.makeText(RecyclerViewActivity.this, data.getName() + ":  " + position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void handlerTemplate2(MyViewHolder holder, Data data){
        ImageView photo = holder.getView(R.id.recyclerview_item_my_photo);
        photo.setImageResource(holder.getDrawableId(data.getLogo()));
        TextView name = holder.getView(R.id.recyclerview_item_my_name);
        name.setText(data.getName());
        TextView number = holder.getView(R.id.recyclerview_item_my_number);
        number.setText("微信號: " + data.getNotificationText());
        ImageView two = holder.getView(R.id.recyclerview_item_my_two);
        two.setImageResource(holder.getDrawableId(data.getNotificationImg()));
        two.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(RecyclerViewActivity.this,"two 000000 ",Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void handlerTemplate5(MyViewHolder holder, Data data){
        ImageView photo = holder.getView(R.id.recyclerview_item_ordinary_1_img);
        photo.setImageResource(holder.getDrawableId(data.getLogo()));
        TextView name = holder.getView(R.id.recyclerview_item_ordinary_1_text);
        name.setText(data.getName());
        if (null!= data.getNotificationText() ){
            TextView number = holder.getView(R.id.recyclerview_item_notification_1_img);
            number.setVisibility(View.VISIBLE);
            number.setText(data.getNotificationText());
        }
       if (null != data.getNotificationImg()){
           ImageView two = holder.getView(R.id.recyclerview_item_notification_1_text);
           two.setVisibility(View.VISIBLE);
           two.setImageResource(holder.getDrawableId(data.getNotificationImg()));
       }

    }
    private void handlerTemplate6(MyViewHolder holder, Data data){
        ImageView photo = holder.getView(R.id.recyclerview_item_ordinary_2_img);
        photo.setImageResource(holder.getDrawableId(data.getLogo()));
        TextView name = holder.getView(R.id.recyclerview_item_ordinary_2_text);
        name.setText(data.getName());
        if (null!= data.getNotificationText() ){
            TextView number = holder.getView(R.id.recyclerview_item_notification_2_img);
            number.setVisibility(View.VISIBLE);
            number.setText(data.getNotificationText());
        }
        if (null != data.getNotificationImg()){
            ImageView two = holder.getView(R.id.recyclerview_item_notification_2_text);
            two.setVisibility(View.VISIBLE);
            two.setImageResource(holder.getDrawableId(data.getNotificationImg()));
        }
    }


}

Deta數據類代碼:

package com.example.administrator.foundationdemo.recyclerview;

/**
 * Created by "sinlov" on 2017/4/13.
 */
public class Data {

    private int viewType;

    private String name;

    private String logo;

    private String notificationText;

    private String notificationImg;

    public Data(){

    }

    public Data(int viewType, String name, String logo) {
        this.viewType = viewType;
        this.name = name;
        this.logo = logo;
    }

    public Data(int viewType, String name, String logo, String notificationText, String notificationImg) {
        this.viewType = viewType;
        this.name = name;
        this.logo = logo;
        this.notificationText = notificationText;
        this.notificationImg = notificationImg;
    }

    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLogo() {
        return logo;
    }

    public void setLogo(String logo) {
        this.logo = logo;
    }

    public String getNotificationText() {
        return notificationText;
    }

    public void setNotificationText(String notificationText) {
        this.notificationText = notificationText;
    }

    public String getNotificationImg() {
        return notificationImg;
    }

    public void setNotificationImg(String notificationImg) {
        this.notificationImg = notificationImg;
    }
}

ViewItems類代碼:

package com.example.administrator.foundationdemo.recyclerview;

/**
 * Created by HooRang on 2017/2/22.
 */
public class ViewItems {



    /*分別對應R.layout.activity_recycler_view_recyclerview_item_x*/

   //chat
   public static final int  TEMPLATE_1 = 0x0;

   //my
   public static final int  TEMPLATE_2 = 0x1;


   public static final int  TEMPLATE_3 = 0x2;

   //ordinary
   public static final int  TEMPLATE_4 = 0x3;

   //ordinary_notification_1
   public static final int  TEMPLATE_5 = 0x4;

   //ordinary_notification_2
   public static final int  TEMPLATE_6 = 0x5;




}

activity_recycler_view XML布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:toolbar="http://schemas.android.com/apk/res-auto"
    style="@style/MatchMatch"
    android:background="#d2caca"
    tools:context="com.example.administrator.foundationdemo.recyclerview.RecyclerViewActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        style="@style/MatchMatch"/>
</LinearLayout>

activity_recycler_view_recyclerview_item_my XML布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:background="#fcfcfc"
    android:layout_marginTop ="25dp"
    android:layout_width="match_parent"
    android:layout_height="65dp">

    <RelativeLayout
        android:id="@+id/recyclerview_item_my_relative"
        android:layout_width="0dp"
        android:background="@null"
        android:layout_height="match_parent"
        android:layout_weight="5">

        <ImageView
            android:id="@+id/recyclerview_item_my_photo"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@null"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="20dp"
            android:layout_marginStart="20dp"
            android:src="@mipmap/ic_launcher" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:textStyle="bold"
            android:text="測試"
            android:id="@+id/recyclerview_item_my_name"
            android:layout_alignTop="@+id/recyclerview_item_my_photo"
            android:layout_toRightOf="@+id/recyclerview_item_my_photo"
            android:layout_toEndOf="@+id/recyclerview_item_my_photo"
            android:layout_marginLeft="20dp"
            android:layout_marginStart="20dp" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:text="測試"
            android:id="@+id/recyclerview_item_my_number"
            android:layout_marginTop ="5dp"
            android:layout_below="@id/recyclerview_item_my_name"
            android:layout_alignLeft="@id/recyclerview_item_my_name"
            android:layout_alignStart="@id/recyclerview_item_my_name" />
    </RelativeLayout>
    <RelativeLayout

        android:background="@null"
        android:id="@+id/recyclerview_item_my_two_relative"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.8">
        <ImageView
            android:id="@+id/recyclerview_item_my_two"
            android:background="@null"
            android:src="@mipmap/ic_launcher"
            style="@style/WrapWrap"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>

</LinearLayout>

activity_recycler_view_recyclerview_item_ordinary_notification_1 XML布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginTop ="25dp"
    android:background="#fcfcfc"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/recyclerview_item_ordinary_1_img"
        style="@style/WrapWrap"
        android:background="@null"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="25dp"
        android:layout_marginStart="25dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/recyclerview_item_ordinary_1_text"
        style="@style/WrapWrap"
        android:textSize="15sp"
        android:text="測試"
        android:background="@null"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/recyclerview_item_ordinary_1_img"
        android:layout_toEndOf="@id/recyclerview_item_ordinary_1_img"
        android:layout_marginLeft="25dp"
        android:layout_marginStart="25dp" />

    <ImageView
        android:visibility="gone"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:id="@+id/recyclerview_item_notification_1_img"
        android:background="@null"
        android:src="@mipmap/ic_launcher"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="25dp"
        android:layout_marginEnd="25dp" />
    <TextView
        android:id="@+id/recyclerview_item_notification_1_text"
        style="@style/WrapWrap"
        android:textSize="10sp"
        android:visibility="gone"
        android:text="測試"
        android:background="@null"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@id/recyclerview_item_notification_1_img"
        android:layout_toStartOf="@id/recyclerview_item_notification_1_img"
        android:layout_marginRight="25dp"
        android:layout_marginEnd="25dp" />

</RelativeLayout>

activity_recycler_view_recyclerview_item_ordinary_notification_2 XML布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fcfcfc"
    android:orientation="vertical">

    <TextView
        android:background="#d2caca"
        android:layout_width="match_parent"
        android:layout_height="1.5dp"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="25dp"
        android:id="@+id/textView_null" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@null"
        android:layout_below="@+id/textView_null"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">
        <ImageView
            android:id="@+id/recyclerview_item_ordinary_2_img"
            style="@style/WrapWrap"
            android:background="@null"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="25dp"
            android:layout_marginStart="25dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:id="@+id/recyclerview_item_ordinary_2_text"
            style="@style/WrapWrap"
            android:textSize="15sp"
            android:text="測試"
            android:background="@null"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@id/recyclerview_item_ordinary_2_img"
            android:layout_toEndOf="@id/recyclerview_item_ordinary_2_img"
            android:layout_marginLeft="25dp"
            android:layout_marginStart="25dp" />

        <ImageView
            android:visibility="gone"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:id="@+id/recyclerview_item_notification_2_img"
            android:background="@null"
            android:src="@mipmap/ic_launcher"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginRight="25dp"
            android:layout_marginEnd="25dp" />
        <TextView
            android:visibility="gone"
            android:id="@+id/recyclerview_item_notification_2_text"
            style="@style/WrapWrap"
            android:textSize="10sp"
            android:text="測試"
            android:background="@null"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/recyclerview_item_notification_2_img"
            android:layout_toStartOf="@id/recyclerview_item_notification_2_img"
            android:layout_marginRight="25dp"
            android:layout_marginEnd="25dp" />
    </RelativeLayout>

</RelativeLayout>

希望對你們有幫助,O(∩_∩)O謝謝!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容