android 之图文混排+GridView




实例代码:

package com.hsj.example.gridviewdemo01;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.hsj.example.gridviewdemo01.com.hsj.utils.NetUtils;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private ListView listView_movies;
    private String path;

    private ProgressDialog progressDialog;

    private List<Map<String,Object>> data=new ArrayList<>();

    private SimpleAdapter adapter;

    private int pageNo=1;

    private int pageSize=20;

    /**
     * 是否滚到页面底部
     */
    private boolean isBottom;

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

        this.listView_movies= (ListView) this.findViewById(R.id.listView_movies);
        this.progressDialog=new ProgressDialog(this);
        this.progressDialog.setMessage("正在加载数据,请稍等.....");
        this.progressDialog.setCancelable(false);


        this.listView_movies.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if(isBottom && scrollState== AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
                    pageNo++;

                    try {
                        path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit="+pageSize+"&page_start="+(pageNo-1)*pageSize;
                        new LoadNetDataAsyncTask().execute(path);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                 isBottom=firstVisibleItem+visibleItemCount==totalItemCount;
            }
        });


        try {
            path = "https://movie.douban.com/j/search_subjects?type=movie&tag="+ URLEncoder.encode("热门","utf-8")+"&sort=recommend&page_limit=20&page_start=0";

             new LoadNetDataAsyncTask().execute(path);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


    }


    /**
     * 加载网络数据的
     */
    private final class LoadNetDataAsyncTask extends AsyncTask<String,Void,List<Map<String,Object>>>{

        @Override
        protected void onPreExecute() {
            progressDialog.show();
        }

        @Override
        protected List<Map<String, Object>> doInBackground(String... params) {
            try {
               InputStream inputStream= NetUtils.getInputStreamByPath(params[0]);
                if(inputStream!=null){
                    String json=NetUtils.getJsonByInputStream(inputStream);
                    if(json!=null){
                       return NetUtils.getListMaps(json);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }


        @Override
        protected void onPostExecute(List<Map<String, Object>> maps) {
            if(maps.size()>0){
                data.addAll(maps);

                if(adapter==null){
                    adapter=new SimpleAdapter(MainActivity.this,
                            data,
                            R.layout.movie_item,
                            new String[]{"title","cover"},
                            new int[]{R.id.textView_title,R.id.imageView_cover});




                    /*
                    给用户一次机会:手工将指定数据绑定到指定控件上的机会
                     */
                    adapter.setViewBinder(new SimpleAdapter.ViewBinder() {

                        /**
                         * 当给控件赋值时自动调用的方法
                         * @param view 需要绑定数据的视图对象
                         * @param data  需要给视图设置的数据
                         * @param textRepresentation 需要给视图设置的数据
                         * @return 如果使用setViewValue()方法完成数据绑定则返回true,否则使用默认的数据绑定则返回false
                         */
                        @Override
                        public boolean setViewValue(View view, Object data, final String textRepresentation) {

                            if(view instanceof ImageView){
                                final ImageView imageView_cover= (ImageView) view;

                                class LoadImageSyncTask extends AsyncTask<String,Void,Bitmap>{

                                    @Override
                                    protected Bitmap doInBackground(String... params) {
                                        try {
                                            InputStream inputStream=NetUtils.getInputStreamByPath(textRepresentation);
                                            if(inputStream!=null){
                                                return  BitmapFactory.decodeStream(inputStream);
                                            }
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                        return null;
                                    }

                                    @Override
                                    protected void onPostExecute(Bitmap bitmap) {
                                        if(bitmap!=null){
                                            imageView_cover.setImageBitmap(bitmap);
                                        }
                                    }
                                }

                                new LoadImageSyncTask().execute(textRepresentation);

                                return true;
                            }
                            System.out.println("====setViewValue(View view="+view+", Object data="+data+", String textRepresentation="+textRepresentation+")====");
                            return false;
                        }
                    });



                    listView_movies.setAdapter(adapter);
                }else{
                    adapter.notifyDataSetChanged();
                }
            }

            progressDialog.dismiss();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37169103/article/details/80590521