RecyclerView 萬能適配器

RecyclerVeiw 與ListView區(qū)別:


recyclerView 緩存的Holder而不是View, RecyclerView 不管布局唱逢、不管動畫坞古、不管分隔劫樟、 只管view 的復用,并支持多種刷新模式:notifyDataSetChanged(), notifyItemInserted(position), notifyItemRemoved(position)等多種刷新模式奶陈,很大程度提高效率吃粒。

LayoutManager布局管理器:


LinearLaoutManager:線形
GridLayoutManager:網格
StaggeredManager:錯亂樣式(瀑布流)

簡單使用:


在xmlk 中的布局

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

RecyclerView Adapter



/**
 * 說明:基本使用
 * 波粒:1050189980 2018/6/20
 */
public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.MyHolder> {
    protected List<String> mData;
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    OnItemClick mOnItemClick;

    public SimpleAdapter(Context contex, List<String> data) {
        mContext = contex;
        mData = data;
        mLayoutInflater = LayoutInflater.from(mContext);
    }

    /**
     * 添加數(shù)據(jù)
     */
    public void add(int position) {
        mData.add(position, "新增");
        notifyItemInserted(position);
    }

    /**
     * 刪除數(shù)據(jù)
     */
    public void delete(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }

    /**
     * 點擊事件
     */
    public interface OnItemClick {
        void click(View view, int position);

        void longClick(View view, int position);
    }

    /**
     * 設置事件
     */
    public void setOnItmeClick(OnItemClick onItmeClick) {
        mOnItemClick = onItmeClick;
    }

    /**
     * 創(chuàng)建Holder 對象
     */
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mLayoutInflater.inflate(R.layout.itme_simple, parent, false);
        return new MyHolder(view);
    }

    /**
     * 綁定Holder 設置數(shù)據(jù)與事件
     */
    @Override
    public void onBindViewHolder(final MyHolder holder, final int position) {
        holder.textView.setText(mData.get(position));
        if (mOnItemClick != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClick.click(holder.itemView, holder.getLayoutPosition());
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mOnItemClick.longClick(holder.itemView, holder.getLayoutPosition());
                    return false;
                }
            });
        }
    }

    /**
     * item大小
     */
    @Override
    public int getItemCount() {
        return mData.size();
    }

    public class MyHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public MyHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }
    }
}

在Activity 中使用


/**
 * RecyclerView  的簡單使用
 */
public class SimpleActivity extends AppCompatActivity {
    RecyclerView mRecyclerView;
    private List<String> mData;
    SimpleAdapter simpleAdapter;
    SimpleStaggeredAdapter simpleStaggeredAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);
        mRecyclerView = findViewById(R.id.recyclerView);
        mData = new ArrayList<>();
        //添加數(shù)據(jù)源
        for (int i = 'A'; i <= 'z'; i++) {
            mData.add("" + (char) i);
        }

        simpleStaggeredAdapter = new SimpleStaggeredAdapter(this, mData);
        simpleAdapter = new SimpleAdapter(this, mData);
        //設置adapter
        mRecyclerView.setAdapter(simpleAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        //設置管理器
        mRecyclerView.setLayoutManager(linearLayoutManager);
        //設置動畫
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //設置分隔線
        DividerItemDecoration decoration1 = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        mRecyclerView.addItemDecoration(decoration1);
        //設置事件
        simpleAdapter.setOnItmeClick(new SimpleAdapter.OnItemClick() {
            @Override
            public void click(View view, int position) {
                Toast.makeText(SimpleActivity.this, "click" + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void longClick(View view, int position) {
                simpleAdapter.delete(position);
                Toast.makeText(SimpleActivity.this, "longClick" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //導入菜單布局
        getMenuInflater().inflate(R.menu.menu_simple, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //線型
        if (item.getItemId() == R.id.listView) {
            mRecyclerView.setAdapter(simpleAdapter);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            //網格
        } else if (item.getItemId() == R.id.gridView) {
            mRecyclerView.setAdapter(simpleAdapter);
            mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
            //瀑布流
        } else if (item.getItemId() == R.id.horizontal) {
            mRecyclerView.setAdapter(simpleAdapter);
            mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL));
            //橫向滑動
        } else if (item.getItemId() == R.id.staggeredView) {
            mRecyclerView.setAdapter(simpleStaggeredAdapter);
            mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));
            //添加數(shù)據(jù)
        } else if (item.getItemId() == R.id.add) {
            simpleAdapter.add(1);
            //減少數(shù)據(jù)
        } else if (item.getItemId() == R.id.delete) {
            simpleAdapter.delete(1);
        }
        return super.onOptionsItemSelected(item);
    }
}

效果如下:

QQ圖片20180621000226.png
QQ圖片20180621000233.png

組合使用:

(支持下拉刷新與自動加載肖爵,支持多布局與多數(shù)據(jù)源)

通過一個adaper 進行實現(xiàn)臀脏,使用者只需傳入布局id與數(shù)據(jù)源即可谁榜,使用簡單方便,不用重復寫adapter.

在xml 在使用

 <cashierdesk.xkeshi.com.simple.x_view.recyclerview.XRecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

自定義 Adapter


/**
 * 說明:RecyclerView 包裹Adapter
 * 楊陽:360621904 2018/5/30
 */
@SuppressWarnings({"unchecked", "unused"})
public abstract class WrapperAdapter extends RecyclerView.Adapter<WrapperViewHolder> {
    private IWrapperAdapterListener.OnItemClick mOnItemClick;
    private IWrapperAdapterListener.OnItemLongClick mOnItemLongClick;
    private Map<ItemType, List> mTypeList;
    private LayoutInflater inflater;
    private MyListenerImp myListenerImp;
    private RecyclerView.ViewHolder holder;
    private RecyclerView mRecyclerView;
    /**
     * item 的UI 存儲需要跨列的類型(目前是加載類型)
     */
    private List<Integer> mItemTypeData;

    @SuppressWarnings("WeakerAccess")
    public WrapperAdapter(@NonNull Context context) {
        mTypeList = new LinkedHashMap<>();
        this.inflater = LayoutInflater.from(context);
        myListenerImp = new MyListenerImp();
        mItemTypeData = new ArrayList<>();
    }

    /**
     * 添加單布局holder
     *
     * @param LayoutId 布局Id
     * @param data     數(shù)據(jù)源
     */
    public void addHolder(int LayoutId, @NonNull List data) {
        mTypeList.put(new ItemType(LayoutId), data);
    }

    /**
     * 添加多布局holder,實體對象必須實現(xiàn) {@link IWrapperAdapterMoreType}這個接口
     *
     * @param data 數(shù)據(jù)源
     */
    public void addMoreHolder(@NonNull List<IWrapperAdapterMoreType> data) {
        mTypeList.put(new ItemType(IWrapperAdapterMoreType.class.hashCode()), data);
    }

    public void addFloorLoadingHolder(int layoutId, @NonNull List<IWrapperAdapterFloorType> data,
                                      IWrapperAdapterListener.OnLoadingFloorItemShowCallback onLoadingFloorItemShowCallback) {
        mTypeList.put(new ItemTypeTwo(layoutId, onLoadingFloorItemShowCallback), data);
        mItemTypeData.add(layoutId);
    }


    /**
     * 設置item 的數(shù)據(jù)
     *
     * @param holder item 對應的Holder
     * @param object item 對應的數(shù)據(jù)對象
     */
    public abstract void setItemData(WrapperViewHolder holder, Object object);

    public void setOnItemClick(IWrapperAdapterListener.OnItemClick onItemLick) {
        mOnItemClick = onItemLick;
    }

    public void setOnItemLongClick(IWrapperAdapterListener.OnItemLongClick onItemLongClick) {
        mOnItemLongClick = onItemLongClick;
    }

    @Override
    public WrapperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new WrapperViewHolder(inflater.inflate(viewType, parent, false), viewType);
    }

    @Override
    public void onBindViewHolder(final WrapperViewHolder holder, final int position) {
        setItemData(holder, getValue(position));
        Object object = getValue(position);
        //把holder,position,data 添加到view tag 中
        holder.itemView.setTag(R.id.tag_key_holder, holder);
        holder.itemView.setTag(R.id.tag_key_position, holder.getLayoutPosition());
        holder.itemView.setTag(R.id.tag_key_data, object);
        if (mOnItemClick != null && !(object instanceof IWrapperAdapterFloorType))
            holder.itemView.setOnClickListener(myListenerImp);
        if (mOnItemLongClick != null)
            holder.itemView.setOnLongClickListener(myListenerImp);
        if (mOnItemClick != null || mOnItemLongClick != null)
            holder.setItemBackground();
        //判斷是否是加載的itemView
        if (object instanceof IWrapperAdapterFloorType) {
            ItemTypeTwo typeTwo = (ItemTypeTwo) getKey(position);
            assert typeTwo != null;
            if (typeTwo.mOnLoadingFloorItemShowCallback != null)
                typeTwo.mOnLoadingFloorItemShowCallback.floorItemShowCallback(holder.itemView, holder, holder.getLayoutPosition(), object);
        }
    }

    @Override
    public int getItemCount() {
        return getSumCount();
    }

    @Override
    public int getItemViewType(int position) {
        return getMyItemViewType(position);
    }

    @Override
    public void onViewAttachedToWindow(WrapperViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        // 處理StaggeredGridLayoutManager,設置充滿整行
        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
        if (null != layoutParams && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
            if (mItemTypeData.contains(mRecyclerView.getAdapter().getItemViewType(holder.getLayoutPosition())))
                ((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
        }
    }


    @Override
    public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        mRecyclerView = recyclerView;
        // 處理GridLayoutManager绣张,設置充滿整行
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    if (mItemTypeData.contains(mRecyclerView.getAdapter().getItemViewType(position))) {
                        return gridLayoutManager.getSpanCount();
                    }
                    return 1;
                }
            });
        }
    }

    /**
     * 事件回調的處理
     */
    class MyListenerImp implements View.OnClickListener, View.OnLongClickListener {
        @Override
        public void onClick(View view) {
            mOnItemClick.click(view, (WrapperViewHolder) view.getTag(R.id.tag_key_holder), (int) view.getTag(R.id.tag_key_position), view.getTag(R.id.tag_key_data));
        }

        @Override
        public boolean onLongClick(View view) {
            mOnItemLongClick.longClick(view, (WrapperViewHolder) view.getTag(R.id.tag_key_holder), (int) view.getTag(R.id.tag_key_position), view.getTag(R.id.tag_key_data));
            return false;
        }
    }

    /**
     * 總條目數(shù)
     */
    private int getSumCount() {
        int sumCount = 0;
        for (Map.Entry entry : mTypeList.entrySet()) {
            if (entry.getValue() != null)
                sumCount += ((List) entry.getValue()).size();
        }
        return sumCount;
    }

    /**
     * 條目UI 類型
     */
    private int getMyItemViewType(int position) {
        int count = 0;
        for (Map.Entry entry : mTypeList.entrySet()) {
            List list = (List) entry.getValue();
            //多布局
            if (list.get(0) instanceof IWrapperAdapterMoreType && ((count + list.size()) > position)) {
                int moreCount = count;
                for (int i = 0; i < list.size(); i++) {
                    if (moreCount == position) {
                        return ((IWrapperAdapterMoreType) list.get(i)).getItemViewId();
                    }
                    moreCount++;
                }
            }
            //統(tǒng)一布局
            count += ((List) entry.getValue()).size();
            if (count > position) {
                return ((ItemType) entry.getKey()).layoutId;
            }
        }
        return -1;
    }

    private ItemType getKey(int position) {
        int sumCount = 0;
        for (Map.Entry entry : mTypeList.entrySet()) {
            sumCount += ((List) entry.getValue()).size();
            if (sumCount > position) {
                return (ItemType) entry.getKey();
            }
        }
        return null;
    }

    /**
     * 獲取數(shù)據(jù)對象
     */
    private Object getValue(int position) {
        int sumCount = 0;
        for (Map.Entry entry : mTypeList.entrySet()) {
            for (int i = 0; i < ((List) entry.getValue()).size(); i++) {
                if (sumCount == position) {
                    return ((List) entry.getValue()).get(i);
                }
                sumCount++;
            }
        }
        return null;
    }

    /**
     * 布局的類型
     */
    class ItemType {
        //布局的id
        int layoutId;

        ItemType(int layoutId) {
            this.layoutId = layoutId;
        }
    }

    class ItemTypeTwo extends ItemType {
        IWrapperAdapterListener.OnLoadingFloorItemShowCallback mOnLoadingFloorItemShowCallback;

        ItemTypeTwo(int layoutId, IWrapperAdapterListener.OnLoadingFloorItemShowCallback callback) {
            super(layoutId);
            this.mOnLoadingFloorItemShowCallback = callback;
        }
    }

}

Activity 中使用


/**
 * RecyclerView  組合的封閉使用
 */
public class TestXRecyclerViewActivity2 extends AppCompatActivity {
    XRecyclerView mRecyclerView;
    private List<String> mData;
    private List<String> mData1;
    private List<IWrapperAdapterMoreType> mData2;
    WrapperAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_xrecyclerview);
        mRecyclerView = findViewById(R.id.recyclerView);
        mData = new ArrayList<>();
        mData1 = new ArrayList<>();
        mData2 = new ArrayList<>();

        addData();
        adapter = new WrapperAdapter(TestXRecyclerViewActivity2.this) {
            @Override
            public void setItemData(WrapperViewHolder holder, Object object) {
                setHolderData(holder, object);
            }
        };

        //設置數(shù)據(jù),與布局id
        adapter.addHolder(R.layout.item_more_one, mData);
        adapter.addHolder(R.layout.item_more_two, mData);
        adapter.addHolder(R.layout.item_more_three, mData);
        adapter.addHolder(R.layout.item_more_one, mData1);
        adapter.addMoreHolder(mData2);

        //設置布局宋雏,動畫、adapter
//        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        GridLayoutManager linearLayoutManager = new GridLayoutManager(this, 2, StaggeredGridLayoutManager.VERTICAL, false);
//        StaggeredGridLayoutManager linearLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(adapter);

        //添加線
        VerticalDividerItemDecoration decoration = new VerticalDividerItemDecoration.Builder(this)
                .colorResId(R.color.colorGreen)
                .sizeResId(R.dimen.db_size)
                .build();
        mRecyclerView.addItemDecoration(decoration);
        //添加線
        HorizontalDividerItemDecoration decorationH = new HorizontalDividerItemDecoration.Builder(this)
                .colorResId(R.color.colorGreen)
                .sizeResId(R.dimen.db_size)
                .showLastDivider()
                .build();
        mRecyclerView.addItemDecoration(decorationH);
        //設置事件與回調
        setListener();

    }

    int count;

    /**
     * 設置事件與回調
     */
    private void setListener() {
        /**
         * 設置點擊事件
         */
        adapter.setOnItemClick(new IWrapperAdapterListener.OnItemClick() {
            @Override
            public void click(View view, WrapperViewHolder holder, int position, Object data) {
                if (data instanceof String) {
                    String str = (String) data;
                    Toast.makeText(TestXRecyclerViewActivity2.this, "position:" + str + "--" + position, Toast.LENGTH_SHORT).show();
                }

                if (data instanceof MyWrapperAdapterMoreType) {
                    MyWrapperAdapterMoreType data1 = (MyWrapperAdapterMoreType) data;
                    Toast.makeText(TestXRecyclerViewActivity2.this, "position:" + data1.str + "--" + position, Toast.LENGTH_SHORT).show();
                }
            }
        });
        /**
         * 刷新的回調
         */
        mRecyclerView.setRefreshListener(new IXRecyclerViewBiz.RefreshListener() {
            @Override
            public void onRefreshListener() {
                mData.clear();
                mData.add("new");
                mData2.add(new MyWrapperAdapterMoreType(2, "新22"));
                adapter.notifyDataSetChanged();

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mRecyclerView.stopRefreshing();
                        count = 0;
//                        mRecyclerView.finishLoading();
                    }
                }, 1000);
            }
        });
        /**
         * 加載更多回調
         */
        mRecyclerView.setLoadingListener(new IXRecyclerViewBiz.LoadingListener() {
            @Override
            public void onLoadingListener() {
                Log.e("BBB", "加載的回調");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mData2.add(new MyWrapperAdapterMoreType(1, "加載新" + count));
                        mData2.add(new MyWrapperAdapterMoreType(1, "加載新" + count));
                        mData2.add(new MyWrapperAdapterMoreType(2, "加載新" + count));
                        mData2.add(new MyWrapperAdapterMoreType(1, "加載新" + count));
                        mData2.add(new MyWrapperAdapterMoreType(3, "加載新" + count));
                        mData2.add(new MyWrapperAdapterMoreType(1, "加載新" + count));
                        adapter.notifyDataSetChanged();
                        mRecyclerView.stopRefreshing();
                        count++;
                        if (count == 4) {
                            mRecyclerView.finishLoading();

                        }
                    }
                }, 1000);
            }
        });

    }

    /**
     * 設置UI 數(shù)據(jù)
     */
    private void setHolderData(WrapperViewHolder holder, Object object) {
        if (object instanceof String && R.layout.item_more_one == holder.getLayoutId()) {
            String str = (String) object;
            holder.setText(R.id.textView, str);

        } else if (object instanceof MyWrapperAdapterMoreType) {
            MyWrapperAdapterMoreType data = (MyWrapperAdapterMoreType) object;
            if (R.layout.item_more_one == holder.getLayoutId()) {
                holder.setText(R.id.textView, data.str + "");
            } else if (R.layout.item_more_two == holder.getLayoutId()) {
                holder.setText(R.id.textView1, data.str + "");
                holder.setText(R.id.textView2, data.str + "");
            } else if (R.layout.item_more_three == holder.getLayoutId()) {
                holder.setText(R.id.three_1, data.str + "");
                holder.setText(R.id.three_2, data.str + "");
                holder.setText(R.id.three_3, data.str + "");
            }
        } else if (object instanceof String && R.layout.item_more_two == holder.getLayoutId()) {
            String str = (String) object;
            holder.setText(R.id.textView1, str);
            holder.setText(R.id.textView2, str);

        } else if (object instanceof String && R.layout.item_more_three == holder.getLayoutId()) {
            String str = (String) object;
            holder.setText(R.id.three_1, str);
            holder.setText(R.id.three_2, str);
            holder.setText(R.id.three_3, str);
        }

    }

    /**
     * 添加數(shù)據(jù)
     */
    private void addData() {
        for (int i = 'A'; i <= 'C'; i++) {
            mData.add("" + (char) i);
        }
        mData1.add("1111111");
        mData1.add("1111111");
        mData1.add("1111111");
        mData1.add("1111111");
        mData1.add("1111111");

        mData2.add(new MyWrapperAdapterMoreType(3, "我是3"));
        mData2.add(new MyWrapperAdapterMoreType(2, "我是2"));
        mData2.add(new MyWrapperAdapterMoreType(2, "我是2"));
        mData2.add(new MyWrapperAdapterMoreType(2, "我是2"));
        mData2.add(new MyWrapperAdapterMoreType(2, "我是2"));
        mData2.add(new MyWrapperAdapterMoreType(2, "我是2"));
        mData2.add(new MyWrapperAdapterMoreType(1, "我是1"));
    }

    class MyWrapperAdapterMoreType implements IWrapperAdapterMoreType {
        int type;
        String str;

        MyWrapperAdapterMoreType(int type, String str) {
            this.type = type;
            this.str = str;
        }

        @Override
        public int getItemViewType() {
            return type;
        }

        @Override
        public int getItemViewId() {
            if (type == 1) {
                return R.layout.item_more_one;
            } else if (type == 2) {
                return R.layout.item_more_two;
            } else {
                return R.layout.item_more_three;
            }
        }
    }

}

效果展示

QQ圖片20180621004110.png
QQ圖片20180621004115.png

源碼中有例子請運行查看:

  • 有帶刷新與加載的自定義RecyclerView
  • 有支持DataBinding 適配器
  • 有分隔線
    源碼地址下載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汹桦,隨后出現(xiàn)的幾起案子鉴裹,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖凛,死亡現(xiàn)場離奇詭異绪穆,居然都是意外死亡,警方通過查閱死者的電腦和手機菠红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門试溯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郊酒,“玉大人,你說我怎么就攤上這事摹闽『纸。” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵舵匾,是天一觀的道長慢叨。 經常有香客問我拍谐,道長馏段,這世上最難降的妖魔是什么践瓷? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任晕翠,我火速辦了婚禮,結果婚禮上淋肾,老公的妹妹穿的比我還像新娘樊卓。我一直安慰自己,他們只是感情好碌尔,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布唾戚。 她就那樣靜靜地躺著,像睡著了一般熊镣。 火紅的嫁衣襯著肌膚如雪立由。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天毕箍,我揣著相機與錄音道盏,去河邊找鬼荷逞。 笑死,一個胖子當著我的面吹牛种远,可吹牛的內容都是我干的坠敷。 我是一名探鬼主播射富,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粥帚,長吁一口氣:“原來是場噩夢啊……” “哼芒涡!你這毒婦竟也來了?” 一聲冷哼從身側響起费尽,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤旱幼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸯两,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡钧唐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年钝侠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅韧。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡忽舟,死狀恐怖,靈堂內的尸體忽然破棺而出刁品,到底是詐尸還是另有隱情浩姥,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布兜挨,位于F島的核電站,受9級特大地震影響骆莹,放射性物質發(fā)生泄漏担猛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一先改、第九天 我趴在偏房一處隱蔽的房頂上張望蒸走。 院中可真熱鬧比驻,春花似錦、人聲如沸别惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堤撵。三九已至羽莺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屠橄,已是汗流浹背闰挡。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溪北,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓茉继,卻偏偏與公主長得像蚀乔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子派撕,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容