Android学习笔记12—自定义 ListView开发详解(二)

引言

该节介绍如何在开发中使用ViewHolder实现自定义ListView

开发流程

Step-1 新建一个Module,命名为ViewHolderListViewActivity
Step-2 在ViewHolderListViewActivity绑定的布局文件中添加ListView组件

<!-- divider="@null" 属性的作用为取消ListView各Item间的分割线 -->
<ListView
        android:id="@+id/listViewInfo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@null"/>

Step-3 添加自定义布局文件设置每个Item的基本样式

<ImageView
    android:id="@+id/imgIcon"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:src="@drawable/photo02"/>

<TextView
    android:id="@+id/txtUserName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:text="用户姓名"
    android:textSize="16sp"
    android:textColor="#3c6393"/>

<TextView
    android:id="@+id/txtInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtUserName"
    android:layout_marginTop="6dp"
    android:text="消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息"
    android:textSize="14sp"
    android:lineSpacingMultiplier="1.1"
    android:textColor="#2a2b2b"/>

<!-- 嵌套布局LinearLayout线型布局模式 -->
<LinearLayout
    android:id="@+id/layoutImages"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtInfo"
    android:layout_marginTop="10dp"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo01"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo02"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo03"
        android:layout_marginRight="5dp"/>

</LinearLayout>

<TextView
    android:id="@+id/txtPublish"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/layoutImages"
    android:layout_marginTop="10dp"
    android:text="2016-09-29 14:35"
    android:textSize="10sp"
    android:textColor="#3c6393"/>

<ImageView
    android:id="@+id/btnPin"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_below="@id/layoutImages"
    android:layout_alignParentRight="true"
    android:src="@android:drawable/ic_menu_send"/>

<!-- 嵌套布局LinearLayout线型布局模式 -->
<LinearLayout
    android:id="@+id/layoutReplys"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtPublish"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    android:background="#c8d8f1"
    android:padding="5dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

</LinearLayout>

<TextView
    android:id="@+id/txtNickName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="貂蝉"
    android:layout_toRightOf="@id/imgPhoto"
    android:layout_marginLeft="10dp"
    android:textColor="#4a90e6"
    android:textSize="16sp"/>

<TextView
    android:id="@+id/txtMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="这里是我发送的消息,呵呵呵呵这里是我发送的消息,呵呵呵呵这里是我发送的消息,呵呵呵呵这里是我发送的消息,呵呵呵呵"
    android:layout_toRightOf="@id/imgPhoto"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtNickName"
    android:layout_marginTop="5dp"
    android:lineSpacingMultiplier="1.1"
    android:textSize="12sp"
    android:textColor="#3e3d3d"/>

Step-4 新建一个ViewHolder文件,用于声明获取各组件的id的变量

public class InfoViewHolder {
    public ImageView imgIcon, btnPin;
    public TextView txtUserName, txtInfo, txtPublish;
    public LinearLayout layoutImages, layoutReplys;
}

Step-5 自定义适配器

public class InfoAdapter extends BaseAdapter {

private Context mContext;
private List<Map<String, ?>> listItems;
private LayoutInflater inflater;

public InfoAdapter(List<Map<String, ?>> listItems, Context mContext) {
    super();
    this.inflater = LayoutInflater.from(mContext);
    this.listItems = listItems;
    this.mContext = mContext;
}

@Override
public int getCount() {
    return this.listItems.size();
}

@Override
public Object getItem(int position) {
    return this.listItems.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

/*
* 使用循环迭代遍历listItems中的每一个选项对象,并通过转换视图对象ConverView动态加载当前选项布局资源
* 同时根据ListItem中的选项对象参数,动态设置其组件显示和内容
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    /* 步骤1:创建一个空的InfoViewHolder对象 */
    InfoViewHolder infoViewHolder = null;
    /* 步骤2:判断但钱的转换视图参数convertView是否为空,若为空则实例化viewHolder对象中的组件 */
    if(convertView == null){
        infoViewHolder = new InfoViewHolder();
        /* 步骤3:转换视图绑定列表选项布局文件 */
        convertView = this.inflater.inflate(R.layout.listitem_view_holder_list_view, null);
        /* 步骤4:获取列表布局中的所有组件对象 */
        infoViewHolder.imgIcon = (ImageView) convertView.findViewById(R.id.imgIcon);
        infoViewHolder.txtUserName = (TextView) convertView.findViewById(R.id.txtUserName);
        infoViewHolder.txtInfo = (TextView) convertView.findViewById(R.id.txtInfo);
        infoViewHolder.layoutImages = (LinearLayout) convertView.findViewById(R.id.layoutImages);
        infoViewHolder.txtPublish = (TextView) convertView.findViewById(R.id.txtPublish);
        infoViewHolder.btnPin = (ImageView) convertView.findViewById(R.id.btnPin);
        infoViewHolder.layoutReplys = (LinearLayout) convertView.findViewById(R.id.layoutReplys);

        /* 步骤5:转换视图设置ViewHolder对象*/
        convertView.setTag(infoViewHolder);
    }else{
        infoViewHolder = (InfoViewHolder) convertView.getTag();
    }

    /* 步骤6:动态为每一个选项对象赋值 */
    infoViewHolder.imgIcon.setImageResource((Integer) this.listItems.get(position).get("imgIcon"));
    infoViewHolder.txtUserName.setText(this.listItems.get(position).get("txtUserName").toString());
    infoViewHolder.txtInfo.setText(this.listItems.get(position).get("txtInfo").toString());
    infoViewHolder.txtPublish.setText(this.listItems.get(position).get("txtPublish").toString());

    /* 步骤7:动态设置适配器中的组件显示 */
    if(this.listItems.get(position).get("layoutImages").toString().equals("0")){
        infoViewHolder.layoutImages.setVisibility(View.GONE);
    }

    if(this.listItems.get(position).get("layoutReplys").toString().equals("0")){
        infoViewHolder.layoutReplys.setVisibility(View.GONE);
    }

    /* 步骤8:监听器绑定 */
    infoViewHolder.btnPin.setOnClickListener(new ViewOcl(position));

    return convertView;
}

/* 自定义一个单击监听器 */
private class ViewOcl implements View.OnClickListener{
    private int position;

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

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnPin:
                Toast.makeText(mContext, "你要回复 ["+ listItems.get(position).get("txtUserName") +"]", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

}
Step-6 在Activity中初始化ListView适配器并绑定

public class ViewHolderListViewActivity extends AppCompatActivity {

private ListView listViewInfo;
private List<Map<String, ?>> listItems;

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

    this.listItems = this.getListItems();

    InfoAdapter adapter = new InfoAdapter(this.listItems, this);

    this.listViewInfo = (ListView) findViewById(R.id.listViewInfo);

    this.listViewInfo.setAdapter(adapter);
}

private List<Map<String, ?>> getListItems() {
    List<Map<String, ?>> listItems = new ArrayList<>();

    Map<String, Object> item01 = new HashMap<>();
    item01.put("id", 1);
    item01.put("imgIcon", R.drawable.photo01);
    item01.put("txtUserName", "西施");
    item01.put("txtInfo", "西施发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item01.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item01.put("layoutImages", "0");
    item01.put("layoutReplys", "1");

    listItems.add(item01);

    Map<String, Object> item02 = new HashMap<>();
    item02.put("id", 2);
    item02.put("imgIcon", R.drawable.photo02);
    item02.put("txtUserName", "貂蝉");
    item02.put("txtInfo", "貂蝉发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item02.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item02.put("layoutImages", "1");
    item02.put("layoutReplys", "0");

    listItems.add(item02);

    Map<String, Object> item03 = new HashMap<>();
    item03.put("id", 3);
    item03.put("imgIcon", R.drawable.photo03);
    item03.put("txtUserName", "吕布");
    item03.put("txtInfo", "吕布发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item03.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item03.put("layoutImages", "1");
    item03.put("layoutReplys", "1");

    listItems.add(item03);

    return listItems;
  }
}
结果展示

ViewHolderListView.png
代码清单

activity_view_holder_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.chinasofti.demo04listview.ViewHolderListViewActivity">

<ListView
    android:id="@+id/listViewInfo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"/>
    
</RelativeLayout>

listitem_view_holder_list_view.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="match_parent"
android:padding="16dp">

<ImageView
    android:id="@+id/imgIcon"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:src="@drawable/photo02"/>

<TextView
    android:id="@+id/txtUserName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:text="用户姓名"
    android:textSize="16sp"
    android:textColor="#3c6393"/>

<TextView
    android:id="@+id/txtInfo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtUserName"
    android:layout_marginTop="6dp"
    android:text="消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息消息"
    android:textSize="14sp"
    android:lineSpacingMultiplier="1.1"
    android:textColor="#2a2b2b"/>

<!-- 嵌套布局LinearLayout线型布局模式 -->
<LinearLayout
    android:id="@+id/layoutImages"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtInfo"
    android:layout_marginTop="10dp"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo01"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo02"
        android:layout_marginRight="5dp"/>

    <ImageView
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/photo03"
        android:layout_marginRight="5dp"/>

</LinearLayout>

<TextView
    android:id="@+id/txtPublish"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/layoutImages"
    android:layout_marginTop="10dp"
    android:text="2016-09-29 14:35"
    android:textSize="10sp"
    android:textColor="#3c6393"/>

<ImageView
    android:id="@+id/btnPin"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_below="@id/layoutImages"
    android:layout_alignParentRight="true"
    android:src="@android:drawable/ic_menu_send"/>

<!-- 嵌套布局LinearLayout线型布局模式 -->
<LinearLayout
    android:id="@+id/layoutReplys"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/imgIcon"
    android:layout_marginLeft="10dp"
    android:layout_below="@id/txtPublish"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    android:background="#c8d8f1"
    android:padding="5dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="吕布 回复:不错!"
        android:layout_marginBottom="3dp"/>

</LinearLayout>
</RelativeLayout>

InfoViewHolder.java

package com.chinasofti.holder;

import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class InfoViewHolder {
    public ImageView imgIcon, btnPin;
    public TextView txtUserName, txtInfo, txtPublish;
    public LinearLayout layoutImages, layoutReplys;
}

InfoAdapter.java

package com.chinasofti.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.chinasofti.demo04listview.R;
import com.chinasofti.holder.InfoViewHolder;

import java.util.List;
import java.util.Map;

public class InfoAdapter extends BaseAdapter {

private Context mContext;
private List<Map<String, ?>> listItems;
private LayoutInflater inflater;

public InfoAdapter(List<Map<String, ?>> listItems, Context mContext) {
    super();
    this.inflater = LayoutInflater.from(mContext);
    this.listItems = listItems;
    this.mContext = mContext;
}

@Override
public int getCount() {
    return this.listItems.size();
}

@Override
public Object getItem(int position) {
    return this.listItems.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

/*
* 使用循环迭代遍历listItems中的每一个选项对象,并通过转换视图对象ConverView动态加载当前选项布局资源
* 同时根据ListItem中的选项对象参数,动态设置其组件显示和内容
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // 步骤1:创建一个空的InfoViewHolder对象
    InfoViewHolder infoViewHolder = null;
    // 步骤2:判断但钱的转换视图参数convertView是否为空,若为空则实例化viewHolder对象中的组件
    if(convertView == null){
        infoViewHolder = new InfoViewHolder();
        // 步骤3:转换视图绑定列表选项布局文件
        convertView = this.inflater.inflate(R.layout.listitem_view_holder_list_view, null);
        // 步骤4:获取列表布局中的所有组件对象
        infoViewHolder.imgIcon = (ImageView) convertView.findViewById(R.id.imgIcon);
        infoViewHolder.txtUserName = (TextView) convertView.findViewById(R.id.txtUserName);
        infoViewHolder.txtInfo = (TextView) convertView.findViewById(R.id.txtInfo);
        infoViewHolder.layoutImages = (LinearLayout) convertView.findViewById(R.id.layoutImages);
        infoViewHolder.txtPublish = (TextView) convertView.findViewById(R.id.txtPublish);
        infoViewHolder.btnPin = (ImageView) convertView.findViewById(R.id.btnPin);
        infoViewHolder.layoutReplys = (LinearLayout) convertView.findViewById(R.id.layoutReplys);

        // 步骤5:转换视图设置ViewHolder对象
        convertView.setTag(infoViewHolder);
    }else{
        infoViewHolder = (InfoViewHolder) convertView.getTag();
    }

    // 步骤6:动态为每一个选项对象赋值
    infoViewHolder.imgIcon.setImageResource((Integer) this.listItems.get(position).get("imgIcon"));
    infoViewHolder.txtUserName.setText(this.listItems.get(position).get("txtUserName").toString());
    infoViewHolder.txtInfo.setText(this.listItems.get(position).get("txtInfo").toString());
    infoViewHolder.txtPublish.setText(this.listItems.get(position).get("txtPublish").toString());

    // 步骤9:动态设置适配器中的组件显示
    if(this.listItems.get(position).get("layoutImages").toString().equals("0")){
        infoViewHolder.layoutImages.setVisibility(View.GONE);
    }

    if(this.listItems.get(position).get("layoutReplys").toString().equals("0")){
        infoViewHolder.layoutReplys.setVisibility(View.GONE);
    }

    // 步骤10:监听器绑定
    infoViewHolder.btnPin.setOnClickListener(new ViewOcl(position));

    return convertView;
}

// 自定义一个单击监听器
private class ViewOcl implements View.OnClickListener{
    private int position;

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

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnPin:
                Toast.makeText(mContext, "你要回复 ["+ listItems.get(position).get("txtUserName") +"]", Toast.LENGTH_SHORT).show();
                break;
        }
      }
   }
}

ViewHolderListViewActivity.java

package com.chinasofti.demo04listview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import com.chinasofti.adapter.InfoAdapter;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ViewHolderListViewActivity extends AppCompatActivity {

private ListView listViewInfo;
private List<Map<String, ?>> listItems;

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

    this.listItems = this.getListItems();

    InfoAdapter adapter = new InfoAdapter(this.listItems, this);

    this.listViewInfo = (ListView) findViewById(R.id.listViewInfo);

    this.listViewInfo.setAdapter(adapter);
}

private List<Map<String, ?>> getListItems() {
    List<Map<String, ?>> listItems = new ArrayList<>();

    Map<String, Object> item01 = new HashMap<>();
    item01.put("id", 1);
    item01.put("imgIcon", R.drawable.photo01);
    item01.put("txtUserName", "西施");
    item01.put("txtInfo", "西施发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item01.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item01.put("layoutImages", "0");
    item01.put("layoutReplys", "1");

    listItems.add(item01);

    Map<String, Object> item02 = new HashMap<>();
    item02.put("id", 2);
    item02.put("imgIcon", R.drawable.photo02);
    item02.put("txtUserName", "貂蝉");
    item02.put("txtInfo", "貂蝉发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item02.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item02.put("layoutImages", "1");
    item02.put("layoutReplys", "0");

    listItems.add(item02);

    Map<String, Object> item03 = new HashMap<>();
    item03.put("id", 3);
    item03.put("imgIcon", R.drawable.photo03);
    item03.put("txtUserName", "吕布");
    item03.put("txtInfo", "吕布发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息发送的消息");
    item03.put("txtPublish", new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date()));
    item03.put("layoutImages", "1");
    item03.put("layoutReplys", "1");

    listItems.add(item03);

    return listItems;
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容