一个通用的popular 多选或者单选

用popularwindow实现。可以实现单选,多选。

先来个gif 代码后面贴出

单选.gif
多选.gif
 

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.util.DisplayMetrics;
import android.util.SparseBooleanArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

 

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

/**
 * create by  宋佳  on 2017/5/9 16:35 .
 * 描述 :商品中的popularWindow
 */

public class ProductPopularWindow implements PopupWindow.OnDismissListener, View.OnClickListener, AdapterView.OnItemClickListener {


    private Activity context;
    private View view;
    private PopupWindow popupWindow;
    private TextView tv_popular_cancel;
    private TextView tv_popular_ok;
    private ListView lv_popular_data;
    private LinearLayout ll_popular_buttons;
    private TextView tv_popular_title;
    private ImageView iv_popular_down;
    private PopularAdapter adapter;
    private List<PopularWindowBean> datas;
    private static int CHOICE_STATE = 0;

    public ProductPopularWindow(Activity context) {
        this.context = context;
        initView();
        initPopuwindow();
        initListener();
    }


    //    public static final int CHOICE_MODE_NONE = 0;  不选择
    //    public static final int CHOICE_MODE_SINGLE = 1; //单选
    //    public static final int CHOICE_MODE_MULTIPLE = 2; //多选


    private void setAdapter(View parent, int type, int[] index) {
        //items upcheck
        this.CHOICE_STATE = type;
        clearSelection();
        lv_popular_data.setChoiceMode(type);
        if (adapter == null) {
            lv_popular_data.setItemsCanFocus(false);
            adapter = new PopularAdapter(context, datas);
            lv_popular_data.setAdapter(adapter);
        }
        //liseview显示最上面
        for (int i = 0; index != null && i < index.length; i++) {
            lv_popular_data.setItemChecked(index[i], true);
        }
        lv_popular_data.setSelection(0);
        adapter.notifyDataSetChanged();
        showAsDropDown(parent);
    }

    private void initPopuwindow() {
        popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        // 这个是进行设置颜色为透明
        popupWindow.setBackgroundDrawable(new ColorDrawable(
                Color.TRANSPARENT));
        popupWindow.setAnimationStyle(R.style.popular_product);
        popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
        popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    }

    private void initListener() {
        popupWindow.setOnDismissListener(this);
        tv_popular_cancel.setOnClickListener(this);
        tv_popular_ok.setOnClickListener(this);
        iv_popular_down.setOnClickListener(this);
        lv_popular_data.setOnItemClickListener(this);
    }

    private void initView() {
        view = LayoutInflater.from(context).inflate(R.layout.popular_products, null);
        tv_popular_cancel = (TextView) view.findViewById(R.id.tv_popular_cancel);//取消
        tv_popular_ok = (TextView) view.findViewById(R.id.tv_popular_ok);//确定
        ll_popular_buttons = (LinearLayout) view.findViewById(R.id.ll_popular_buttons);//确定  取消的 父布局
        lv_popular_data = (ListView) view.findViewById(R.id.lv_popular_data);//listView
        tv_popular_title = (TextView) view.findViewById(R.id.tv_popular_title);//标题
        iv_popular_down = (ImageView) view.findViewById(R.id.iv_popular_down);
    }

    @Override
    public void onDismiss() {
        WindowManager.LayoutParams lp = context.getWindow()
                .getAttributes();
        lp.alpha = 1f;
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        context.getWindow().setAttributes(lp);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_popular_cancel:
                //取消按钮
                popupWindow.dismiss();
                break;
            case R.id.tv_popular_ok:
                //确定按钮
                getSelectPostion();
                break;
            case R.id.iv_popular_down:
                popupWindow.dismiss();
                break;
            default:
                break;
        }
    }

    /**
     * 得到多选情况下  点击确定 选择你刚才多选的数据列表
     */
    private void getSelectPostion() {
        SparseBooleanArray checkedItems = lv_popular_data.getCheckedItemPositions();
        if (checkedItems == null || checkedItems.size() == 0) {
            return;
        }

        int arrays[] = new int[checkedItems.size()];
        for (int i = 0; i < checkedItems.size(); ++i) {
            final int position = checkedItems.keyAt(i);//点击的 position
            final boolean isChecked = checkedItems.valueAt(i);  //是否点击
            if (isChecked) {
                arrays[i] = position;
            }
        }
        popularItemOnclick.getOnItemPosition(arrays);
        popupWindow.dismiss();
    }

    /**
     * 设置标题
     *
     * @param title
     */

    public ProductPopularWindow setProductPopularTitle(String title) {
        tv_popular_title.setText(title);
        return this;
    }

    //清除状态
    private void clearSelection() {
        final int itemCount = lv_popular_data.getCount();
        for (int i = 0; i < itemCount; ++i) {
            lv_popular_data.setItemChecked(i, false);
        }
    }

    //是否隐藏下面的确定 取消按钮
    public ProductPopularWindow isHideBootomLayout(boolean isHiden) {
        if (isHiden) {
            ll_popular_buttons.setVisibility(View.GONE);
        } else {
            ll_popular_buttons.setVisibility(View.VISIBLE);
        }
        return this;
    }


    private void showAsDropDown(View parent) {
        WindowManager.LayoutParams lp = context.getWindow()
                .getAttributes();
        lp.alpha = 0.4f;
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        context.getWindow().setAttributes(lp);
        popupWindow.setTouchable(true);
        popupWindow.setFocusable(true);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        popupWindow.setOutsideTouchable(true);
        changePopularSize();

        popupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);
        popupWindow.setFocusable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.update();
    }

    //改变popular的大小
    private void changePopularSize() {
        int height_default = (int) (getScreenHeght(context) * 0.7f);
        view.measure(0, 0);
        int measuredHeight = view.getMeasuredHeight();
        int count = 0;
        int size = adapter.getCount();
        for (int i = 0; i < size; i++) {
            View childAt = adapter.getView(i, null, lv_popular_data);
            if (childAt != null) {
                childAt.measure(0, 0);
                int measuredHeight2 = childAt.getMeasuredHeight();
                count += measuredHeight2;
            }
        }
        measuredHeight += count;
        if (measuredHeight < height_default) {
            popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        } else {
            popupWindow.setHeight(height_default);
        }
    }

    //得到屏幕的高度
    private int getScreenHeght(Activity context) {
        DisplayMetrics dm = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }


    /**
     * 刷新数据
     *
     * @param datas
     * @param parnent
     * @param type
     * @param indexs
     * @return
     */
    public ProductPopularWindow refreshListDatas(List<PopularWindowBean> datas, View parnent, int type, int[] indexs) {
        if (this.datas == null)
            this.datas = new ArrayList<>();
        this.datas.clear();
        this.datas.addAll(datas);
        setAdapter(parnent, type, indexs);
        return this;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //当选择的模式是单选的时候 则返回它当前的id
        if (CHOICE_STATE == ListView.CHOICE_MODE_SINGLE) {
            //当只有单选模式才是可以的
            popularItemOnclick.getOnItemPosition(new int[]{position});
            popupWindow.dismiss();
            return;
        }
    }


    /**
     * 接口 点击 popular
     */
    public interface OnProductPopularItemOnclick {
        /**
         * 得到点解的postion
         *
         * @param
         */

        void getOnItemPosition(int[] positionArray);
    }

    public OnProductPopularItemOnclick popularItemOnclick;

    public void setPopularItemOnclick(OnProductPopularItemOnclick popularItemOnclick) {
        this.popularItemOnclick = popularItemOnclick;
    }
}

下面贴出popular的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_popu_bg"
    android:orientation="vertical"
    android:paddingLeft="14dp"
    android:paddingRight="14dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        >

        <TextView
            android:id="@+id/tv_popular_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="9"
            android:background="@drawable/popu_title_bg"
            android:gravity="center"
            android:text=""
            android:textColor="@color/text_color_6"
            android:textSize="16sp"/>

        <ImageView
            android:id="@+id/iv_popular_down"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:src="@android:drawable/ic_delete"
            />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="25dp"
        android:layout_marginTop="5dp"
        android:background="#f0f0f0"
        ></View>

    <ListView
        android:id="@+id/lv_popular_data"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:cacheColorHint="#00000000"
        android:divider="#f0f0f0"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/bg_all_select"
        android:scrollbars="none">
    </ListView>

    <LinearLayout
        android:id="@+id/ll_popular_buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:background="@drawable/act_input_bg1"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        >

        <TextView
            android:id="@+id/tv_popular_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:background="@drawable/list_popu_btn_selector"
            android:gravity="center"
            android:paddingBottom="5dp"
            android:paddingTop="5dp"
            android:text="取消"
            android:textColor="@color/text_color_6"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_popular_ok"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:background="@drawable/list_popu_btn_selector"
            android:gravity="center"
            android:paddingBottom="5dp"
            android:paddingTop="5dp"
            android:text="确定"
            android:textColor="@color/text_color_6"
            android:textSize="16sp"/>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="10dp"/>
</LinearLayout>

ListView中listSelector中的代码 就是实现点击Item有个变色的效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/bg_press" android:state_pressed="false" android:state_window_focused="false"/>
    <item android:drawable="@drawable/bg_unpress" android:state_pressed="true" android:state_window_focused="true"/>

</selector>

贴出Adapter的代码

 

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.handongkeji.customview.PopularItemLayout;
import com.handongkeji.jeno.R;
import com.handongkeji.popuwindow.model.PopularWindowBean;

import java.util.List;

/**
 * create by  宋佳  on 2017/5/10 16:57 .
 * 描述 :
 */

public class PopularAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private Context context;
    private List<PopularWindowBean> data;

    public PopularAdapter(Context context, List<PopularWindowBean> data) {
        this.context = context;
        this.data = data;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int i) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_popular_nomal, null);
            viewHolder.popularItemLayout = (PopularItemLayout) convertView.findViewById(R.id.rl_popular_parent);
            viewHolder.tv = (TextView) convertView.findViewById(R.id.itemCaption);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        PopularWindowBean bean = data.get(position);
        viewHolder.tv.setText(bean.getData());
        final ListView lv = (ListView) parent;
        viewHolder.popularItemLayout.setChecked(lv.isItemChecked(position));
        return convertView;
    }

    private class ViewHolder {
        private TextView tv;
        private PopularItemLayout popularItemLayout;
    }
}

item的布局代码

<?xml version="1.0" encoding="utf-8"?>
<com.xxxxx.PopularItemLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_popular_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >


    <TextView
        android:id="@+id/itemCaption"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:focusable="false"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        android:paddingLeft="5dp"
        android:text="对对对"
        android:textColor="@color/text_color_6"
        android:textSize="14sp"/>

    <com.xxxx.customview.InertCheckBox
        android:id="@+id/itemCheckBox"
        style="@style/CustomCheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:focusable="false"
        />
</com.xxxx.PopularItemLayout>

PopularItemLayout

 

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.RelativeLayout;

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

/**
 * create by  宋佳  on 2017/5/10 17:04 .
 * 描述 :自定义的popular 布局  单选或者多选
 */

public class PopularItemLayout extends RelativeLayout implements Checkable {

    /**
     * Interface definition for a callback to be invoked when the checked state of a CheckableRelativeLayout changed.
     */
    public static interface OnCheckedChangeListener {
        public void onCheckedChanged(PopularItemLayout layout, boolean isChecked);
    }

    public PopularItemLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialise(attrs);
    }

    public PopularItemLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialise(attrs);
    }

    public PopularItemLayout(Context context, int checkableId) {
        super(context);
        initialise(null);
    }

    /*
     * @see android.widget.Checkable#isChecked()
     */
    public boolean isChecked() {
        return isChecked;
    }

    /*
     * @see android.widget.Checkable#setChecked(boolean)
     */
    public void setChecked(boolean isChecked) {
        this.isChecked = isChecked;
        for (Checkable c : checkableViews) {
            c.setChecked(isChecked);
        }

        if (onCheckedChangeListener != null) {
            onCheckedChangeListener.onCheckedChanged(this, isChecked);
        }
    }

    /*
     * @see android.widget.Checkable#toggle()
     */
    public void toggle() {
        this.isChecked = !this.isChecked;
        for (Checkable c : checkableViews) {
            c.toggle();
        }
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        this.onCheckedChangeListener = onCheckedChangeListener;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        final int childCount = this.getChildCount();
        for (int i = 0; i < childCount; ++i) {
            findCheckableChildren(this.getChildAt(i));
        }
    }

    /**
     * Read the custom XML attributes
     */
    private void initialise(AttributeSet attrs) {
        this.isChecked = false;
        this.checkableViews = new ArrayList<Checkable>(5);
    }

    /**
     * Add to our checkable list all the children of the view that implement the interface Checkable
     */
    private void findCheckableChildren(View v) {
        if (v instanceof Checkable) {
            this.checkableViews.add((Checkable) v);
        }

        if (v instanceof ViewGroup) {
            final ViewGroup vg = (ViewGroup) v;
            final int childCount = vg.getChildCount();
            for (int i = 0; i < childCount; ++i) {
                findCheckableChildren(vg.getChildAt(i));
            }
        }
    }

    private boolean isChecked;
    private List<Checkable> checkableViews;
    private OnCheckedChangeListener onCheckedChangeListener;
}

InertCheckBox

public class InertCheckBox extends CheckBox {
    // Provide the same constructors as the superclass
    public InertCheckBox(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    // Provide the same constructors as the superclass
    public InertCheckBox(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // Provide the same constructors as the superclass
    public InertCheckBox(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Make the checkbox not respond to any user event  使复选框不响应任何用户事件
        return false;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

    @Override
    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

    @Override
    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

    @Override
    public boolean onTrackballEvent(MotionEvent event) {
        // Make the checkbox not respond to any user event
        return false;
    }

使用的方法

多选

  //弹出数据
                final List<PopularWindowBean> list = new ArrayList<>();
                for (int i = 0; i < 30; i++) {
                    PopularWindowBean bean = new PopularWindowBean();
                    bean.setId(i);
                    bean.setData(new Random().nextInt() + "");
                    list.add(bean);
                }
                ProductPopularWindow p = new ProductPopularWindow(getActivity());
                p.setProductPopularTitle("demo多选").refreshListDatas(list, view, ListView.CHOICE_MODE_MULTIPLE, null).setPopularItemOnclick(new ProductPopularWindow.OnProductPopularItemOnclick() {
                    @Override
                    public void getOnItemPosition(int[] positionArray) {
                        for (int i = 0; i < positionArray.length; i++) {
                            Log.i("数据", "getOnItemPosition:" + list.get(positionArray[i]).getData());
                        }
                    }
                });

单选

popularWindow.setProductPopularTitle("请选择职业").isHideBootomLayout(true).refreshListDatas(list_industry, v, ListView.CHOICE_MODE_SINGLE, array_Industry).setPopularItemOnclick(new ProductPopularWindow.OnProductPopularItemOnclick() {
                        @Override
                        public void getOnItemPosition(int[] positionArray) {
                            array_Industry = positionArray;
                            text_worker_one.setText(list_industry.get(positionArray[0]).getData());
                            //清空小行业
                            text_woek_two.setText("");
                            array_Industry_small = null;
                            String code = list_industry.get(positionArray[0]).getCodeString();
                            initSmallIndustry(code);
                        }
                    });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容