第一周

来源:互联网 发布:入门红酒 知乎 编辑:程序博客网 时间:2024/05/16 09:56
package com.wzq.listviewimagetemp;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;

import java.util.List;

/**
 * listview条目中的文字和图片都是从网络获取的
 */
public class MainActivity extends AppCompatActivity {

    private ListView lv;
    String urlTotal = "http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
    //    List<Student.DataBean> lists = new ArrayList<>();
    private MAdapter mAdapter;
    private List<Product.DataBean> dataList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);
//        mAdapter = new MAdapter();
        initData();

    }

    private void initData() {

        //用AsyncTask配合httpUrlConnection请求网络
            new MAsyncTask().execute(urlTotal);


    }




    class MAdapter extends BaseAdapter {


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

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

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

        @Override
        public View getView(int i, View containerView, ViewGroup viewGroup) {
            View view = View.inflate(MainActivity.this, R.layout.list_item, null);
            TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
            ImageView iv = (ImageView) view.findViewById(R.id.iv);
            tv_name.setText(dataList.get(i).getNews_title());

            /**
             * getView方法每个条目显示的时候都会调用,所以我们在这个请求图片,并设置
             *  把图片url传递给asyncTask
             */
            new MImageAsyncTask(iv).execute(dataList.get(i).getPic_url());

            return view;
        }
    }
    //异步处理任务类; 代替handler,可以方便的更新UI, 底层也是封装的Handler和Thread类;

    /**
     * 1-- 自己写个类继承AsyncTask(一般第一个泛型是传过来的url,第二个是进度数据,第三个是请求网络回来的返回值 )
     */
    class  MAsyncTask extends AsyncTask<String,Void,String> {

        // 这个方法是在子线程请求网络用
        //strings 是可变参数,是个数组;
        @Override
        protected String doInBackground(String... strings) {
            String url = strings[0];
            //用联网工具类请求数据;
            String result = NetWordUtils.getNetjson(url);
            //把请求到的json返回出去;返回个了主线程的那个方法(onPostExecute)
            return result;
        }


        //这个方法是存在于主线程,更新UI用;这个方法的参数 就是doInBackground返回的从网络获取到的数据
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Gson gson = new Gson();
            Product product = gson.fromJson(s, Product.class);
            dataList = product.getData();
            mAdapter = new MAdapter();
            lv.setAdapter(mAdapter);


        }
    }


    /**
     * 用AsyncTask配合HttpUrlconnection 请求图片
     */
    class  MImageAsyncTask extends AsyncTask<String, Void,Bitmap>{
        private ImageView iv;

        public MImageAsyncTask(ImageView iv) {
            this.iv= iv;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            String urlString = strings[0];
            return NetWordUtils.getNetBitmap(urlString);
        }

        //这个方法是主线程,更新图片;
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            iv.setImageBitmap(bitmap);

        }
    }




}