Android,ListView做新闻头条

效果图


image.png

MainActivity 写

package com.example.yanchenglong;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {
    private ListView listview;
    private Button Refresh;
    ArrayList<Boolean> mBooleanArrayList=new ArrayList<Boolean>();//添加刷新
    ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>();
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 404:
                    Toast.makeText(MainActivity.this, "抱歉访问不到", Toast.LENGTH_SHORT).show();
                    break;
                case 0x110:
                    mMyadapter = new Myadapter(MainActivity.this, array, listview,mBooleanArrayList);
                    listview.setAdapter(mMyadapter);
                    mMyadapter.Refresh(mBooleanArrayList);
                    break;
            }
        }
    };
    private Myadapter mMyadapter;

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

    private void init() {
        listview = (ListView) findViewById(R.id.listview);
        Refresh = (Button) findViewById(R.id.Refresh);
        Refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                array.clear();
                Refreshtext();
            }
        });
        Refreshtext();
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                mBooleanArrayList.add(i,true);
                mBooleanArrayList.remove(i+1);
                mMyadapter.Refresh(mBooleanArrayList);
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                intent.putExtra("urlwebview", array.get(i).get("urlwebview"));
                startActivity(intent);
            }
        });
    }

    private void Refreshtext() {
        new Thread() {
            @Override
            public void run() {
                try {
                    URL url = new URL("http://v.juhe.cn/toutiao/index?type=&key=2ca3a5b1cb6edf55250bff550ac34325");
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setConnectTimeout(3000);
                    urlConnection.setReadTimeout(3000);
                    urlConnection.setDoInput(true);
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    if (urlConnection.getResponseCode() == 200) {
                        InputStream inputStream = urlConnection.getInputStream();
                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                        byte[] data = new byte[1024];
                        int lenth = -1;
                        while ((lenth = inputStream.read(data)) != -1) {
                            byteArrayOutputStream.write(data, 0, lenth);
                            byteArrayOutputStream.flush();
                        }
                        byteArrayOutputStream.close();
                        inputStream.close();
                        String s = byteArrayOutputStream.toString();
                        JSONObject jsonObject = new JSONObject(s);
                        int error_code = jsonObject.getInt("error_code");
                        if (error_code == 0) {
                            JSONObject result = jsonObject.getJSONObject("result");
                            JSONArray data1 = result.getJSONArray("data");
                            for (int i = 0; i < data1.length(); i++) {
                                JSONObject jsonObject1 = data1.getJSONObject(i);
                                String category = jsonObject1.getString("author_name");
                                String title = jsonObject1.getString("title");
                                String date = jsonObject1.getString("date");
                                String urlwebview = jsonObject1.getString("url");
                                String thumbnail_pic_s = jsonObject1.getString("thumbnail_pic_s");
                                HashMap<String, String> stringStringHashMap = new HashMap<>();
                                stringStringHashMap.put("category", category);
                                stringStringHashMap.put("title", title);
                                stringStringHashMap.put("date", date);
                                stringStringHashMap.put("urlwebview", urlwebview);
                                stringStringHashMap.put("thumbnail_pic_s", thumbnail_pic_s);
                                array.add(stringStringHashMap);//上面执行删除
                                handler.sendEmptyMessage(0x110);
                            }
                        } else {
                            handler.sendEmptyMessage(404);
                        }

                    } else {
                        handler.sendEmptyMessage(404);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    handler.sendEmptyMessage(404);

                }

            }
        }.start();


    }
}

activity_main.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yanchenglong.MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
    </ListView>

    <Button
        android:id="@+id/Refresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="刷新数据"/>
</LinearLayout>

MyAdapter 适配器

package com.example.yanchenglong;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import static com.example.yanchenglong.R.id.textView4;

/**
 * Created by Administrator on 2018/7/13 0013.
 */

public class Myadapter extends BaseAdapter implements AbsListView.OnScrollListener {
    ArrayList<HashMap<String, String>> array;
    Context context;

    private ImageLoader mImageLoader;
    private int mStart, mEnd;
    private boolean mFirsrIn;

    public static String[] URLS;//用来保存获取当前图片的URL地址

    ArrayList<Boolean> mBooleanArrayList;

    public Myadapter(Context context, ArrayList<HashMap<String, String>> array, ListView listview, ArrayList<Boolean> mBooleanArrayList) {
        this.context = context;
        this.array = array;
        this.mBooleanArrayList=mBooleanArrayList;
        mImageLoader = new ImageLoader(listview);//对ListView操作

        URLS = new String[array.size()];//空间大小

        for (int i = 0; i < array.size(); i++) {
            URLS[i] = array.get(i).get("thumbnail_pic_s");
        }

        listview.setOnScrollListener(this);
        mFirsrIn = true;

    }

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

    @Override
    public Object getItem(int i) {
        return array.get(i);
    }

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

    Dataf dataf = null;
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        if (view == null) {
            dataf = new Dataf();
            view = View.inflate(context, R.layout.item, null);
            dataf.itemImage = view.findViewById(R.id.item_image);
            dataf.textView2 = view.findViewById(R.id.textView2);
            dataf.textView3 = view.findViewById(R.id.textView3);
            dataf.textView4 = view.findViewById(textView4);
            view.setTag(dataf);
        } else {
            dataf = (Dataf) view.getTag();
        }
//        new MyTask(dataf.itemImage).execute(array.get(i).get("thumbnail_pic_s"));
//        DownImage downImage = new DownImage(array.get(i).get("thumbnail_pic_s"));
//        downImage.loadImage(new DownImage.ImageCallBack() {
//            @Override
//            public void getDrawable(Drawable drawable) {
//                dataf.itemImage.setImageDrawable(drawable);
//            }
//        });

        String url = array.get(i).get("thumbnail_pic_s");
        dataf.itemImage.setTag(url);//绑定对应的图片Url
        //调用showimagebythread把图片和图片URL传过去
//        new ImageLoader().showimagebythread(dataf.itemImage,url);
        mImageLoader.showImageByAsyncTask(dataf.itemImage, url);

        dataf.textView2.setText(array.get(i).get("category"));

        dataf.textView4.setText(array.get(i).get("title"));
        mBooleanArrayList.add(false);//添加标记
        if(mBooleanArrayList.get(i)){
            dataf.textView4.setTextColor(Color.parseColor("#999999"));
        }
        dataf.textView3.setText(array.get(i).get("date"));
        return view;

    }

    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {
        if (i == SCROLL_STATE_IDLE) {//停止状态
            //加载可见项
            mImageLoader.loadImages(mStart, mEnd);
        } else {
            //停止加载
            mImageLoader.cancelAllTasks();
        }
    }
    public void Refresh(ArrayList<Boolean> mBooleanArrayList){
        this.mBooleanArrayList=mBooleanArrayList;
        notifyDataSetChanged();
    }

    @Override//参数二是第一个可见元素的位置,第三个是当前可见元素的长度
    public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int i2) {
        mStart = firstVisibleItem;
        mEnd = firstVisibleItem + visibleItemCount;
        //第一次显示时候调用
        if (mFirsrIn && visibleItemCount > 0) {
            mImageLoader.loadImages(mStart, mEnd);
            mFirsrIn = false;
        }
    }

    class Dataf {
        private ImageView itemImage;//图标
        private TextView textView2;//标题
        private TextView textView3;//时间
        private TextView textView4;//内容
    }

    class MyTask extends AsyncTask<String, Integer, Bitmap> {
        ImageView ig;

        MyTask(ImageView ig) {
            this.ig = ig;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            Log.d("data", strings[0]);
            URL url = null;
            try {
                url = new URL(strings[0]);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.setReadTimeout(10000);
                con.setConnectTimeout(10000);
                con.connect();
                Log.d("data", con.getResponseCode() + "");
                if (con.getResponseCode() == 200) {
                    InputStream is = con.getInputStream();
                    return BitmapFactory.decodeStream(is);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            ig.setImageBitmap(bitmap);
        }
    }
}


适配器内容布局adapter,item

<?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="wrap_content"
              android:orientation="horizontal">

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:text="标题"/>

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:text="是按"/>

        <TextView
            android:id="@+id/textView4"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentStart="true"
            android:layout_below="@id/textView2"
            android:layout_centerVertical="true"
            android:text="内容"/>
    </RelativeLayout>

</LinearLayout>

两种方法可以
一 DownImage downImage = new DownImage(array.get(i).get("thumbnail_pic_s"));
DownImage类

package com.example.yanchenglong;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;

import java.net.URL;

/**
 * Created by Administrator on 2018/7/13 0013.
 */

public class DownImage {
    public String image_path;

    public DownImage(String image_path) {
        this.image_path = image_path;
    }

    public void loadImage(final ImageCallBack callBack) {

        final Handler handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Drawable drawable = (Drawable) msg.obj;
                callBack.getDrawable(drawable);
            }

        };

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Drawable drawable = Drawable.createFromStream(new URL(
                            image_path).openStream(), "");

                    Message message = Message.obtain();
                    message.obj = drawable;
                    handler.sendMessage(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public interface ImageCallBack {
        public void getDrawable(Drawable drawable);
    }
}

二就是MyTask异步
new MyTask(dataf.itemImage).execute(array.get(i).get("thumbnail_pic_s"));

 class MyTask extends AsyncTask<String,Integer,Bitmap> {
        ImageView ig;
        MyTask(ImageView ig){
            this.ig = ig;
        }
        @Override
        protected Bitmap doInBackground(String... strings) {
            Log.d("data",strings[0]);
            URL url = null;
            try {
                url = new URL(strings[0]);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.setReadTimeout(10000);
                con.setConnectTimeout(10000);
                con.connect();
                Log.d("data",con.getResponseCode()+"");
                if(con.getResponseCode() == 200){
                    InputStream is = con.getInputStream();
                    return BitmapFactory.decodeStream(is);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            ig.setImageBitmap(bitmap);
        }
    }

三用缓存ImageLoader

package com.example.yanchenglong;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.LruCache;
import android.widget.ImageView;
import android.widget.ListView;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashSet;

/**
 * //异步加载图片
 * Created by Administrator on 2018/7/14 0014.
 */

public class ImageLoader {
    public ImageView mImageView;
    //缓存Lru算法
    private LruCache<String, Bitmap> mCache;
    private ListView mListView;
    private HashSet<NewAsyncTask> mTask;

    public ImageLoader(ListView listview) {
        mListView = listview;
        mTask = new HashSet<>();
        //获取最大可用内存
        int maxMemoy = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemoy / 4;
        //初始化
        mCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override//用于获取存放每一个对象的大小//加载正确的内存大小
            protected int sizeOf(String key, Bitmap value) {
                //将Bitmap实际大小缓存进去
                //在每次存入缓存的时候调用
                return value.getByteCount();//返回对象的实际大小
            }
        };
    }

    //增加到缓存
    public void addBitmapToCache(String url, Bitmap bitmap) {
        if (getBitmapFromCache(url) == null) {
            mCache.put(url, bitmap);
        }
    }

    //从缓存中获取数据
    public Bitmap getBitmapFromCache(String url) {
        return mCache.get(url);
    }

//    Handler hanler = new Handler() {
//        @Override
//        public void handleMessage(Message msg) {
//            if (mImageView.getTag().equals(mUrl)) {
//                mImageView.setImageBitmap((Bitmap) msg.obj);
//            }
//        }
//    };

//    public void showimagebythread(ImageView imageView, final String url) {
//        mImageView = imageView;//item中的imageView付给了mImageView那么mImageView的更改就是把Item中修改
//        mUrl = url;//使用成员变量,将对应的数据进行缓存从而避免网络不稳定导致一个时序上的混乱
//        new Thread() {
//            @Override
//            public void run() {
//                Bitmap bitmap = getBitmapFromURL(url);
//                Message obtain = Message.obtain();
//                obtain.obj = bitmap;
//                hanler.sendMessage(obtain);
//            }
//        }.start();
//
//    }

    public Bitmap getBitmapFromURL(String urlstring) {
        Bitmap bitmap;
        InputStream is = null;
        try {
            URL url = new URL(urlstring);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            is = new BufferedInputStream(urlConnection.getInputStream());
            bitmap = BitmapFactory.decodeStream(is);
            urlConnection.disconnect();//释放链接资源
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    //用来加载从start到end的所有图片
    public void loadImages(int start, int end) {
        for (int i = start; i < end; i++) {
            if (Myadapter.URLS.length >=0) {
                String url = Myadapter.URLS[i];
                //从缓存中取出对应的图片
                Bitmap bitmap = getBitmapFromCache(url);
                //如果缓存中没有,必须去网络下载
                if (bitmap == null) {
                    NewAsyncTask newAsyncTask = new NewAsyncTask(url);
                    newAsyncTask.execute(url);
                    mTask.add(newAsyncTask);
                } else {
                    ImageView imageview = (ImageView) mListView.findViewWithTag(url);//找到指定Tag来访问他对应的ImageView
                    imageview.setImageBitmap(bitmap);
                }
            }
        }
    }

    public void cancelAllTasks() {
        if (mTask != null) {
            for (NewAsyncTask task : mTask) {
                task.cancel(false);//true是强制停止,false是执行完取消
            }
        }
    }

    public void showImageByAsyncTask(ImageView imageview, String Url) {
        //从缓存中取出对应的图片
        Bitmap bitmap = getBitmapFromCache(Url);
        //如果缓存中没有,必须去网络下载
    if (bitmap == null&&imageview.getTag().equals(Url)) {//我在滚动停止时加载了
//            imageview.setBackgroundResource(R.mipmap.ic_launcher);//正在下载
//            网络下载
//            new NewAsyncTask(Url).execute(Url);
        } else {
            imageview.setImageBitmap(bitmap);
        }
    }

    private class NewAsyncTask extends AsyncTask<String, Void, Bitmap> {
//        private ImageView mImageView;
        private String mUrl;

        //传递ImageView构造ImageView imageview,
        public NewAsyncTask(String url) {
//            mImageView = imageview;
            mUrl = url;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            String url = strings[0];
            //从网络获取图片
            Bitmap bitmapFromURL = getBitmapFromURL(strings[0]);
            if (bitmapFromURL != null) {
                //将不再缓存的图片加入缓存
                addBitmapToCache(url, bitmapFromURL);
            }
            return bitmapFromURL;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
//            if (mImageView.getTag().equals(mUrl)) {
//                mImageView.setImageBitmap(bitmap);
//            }
            ImageView imageview = mListView.findViewWithTag(mUrl);
            if (imageview != null && bitmap != null&&imageview.getTag().equals(mUrl)) {
                imageview.setImageBitmap(bitmap);
            }
            mTask.remove(this);
        }
    }
}

main2Activity

package com.example.yanchenglong;

import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Main2Activity extends AppCompatActivity {
    private WebView webview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        webview = (WebView) findViewById(R.id.webview);
        Intent intent = getIntent();
        if(intent!=null){
        String urlwebview = intent.getStringExtra("urlwebview");
        webview.loadUrl(urlwebview);
        webview.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                setTitle(url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }
        });
    }}
}

main2Activity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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.example.yanchenglong.Main2Activity">
<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></WebView>
</LinearLayout>

还可以去Github搜索smart image view看看

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

推荐阅读更多精彩内容