android 之ListView总结(一个综合实例)

实例效果:



后台逻辑:

package com.hsj.example.paginationloadnetdatademo02;


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
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 com.hsj.example.paginationloadnetdatademo02.com.hsj.domain.Movie;
import com.hsj.example.paginationloadnetdatademo02.com.hsj.utils.Utils;

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

public class MainActivity extends AppCompatActivity {

    private ListView listView_movies;


    private MyAdapter adapter;

    private String path;

    private int pageNo=1;
    private int pageSize=20;

    //总数据源
    private List<Movie> data=new ArrayList<>();


    // 存放最后一个可见条目的索引值
    private int lastVisibleItem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        View footerView=View.inflate(this,R.layout.footer_view,null);
        this.listView_movies.addFooterView(footerView);



        this.listView_movies.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if(lastVisibleItem==adapter.getCount() && 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;
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }

                    new LoadNetDataAsyncTask().execute(path);
                }
            }

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




        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();
        }

    }

    private final class LoadNetDataAsyncTask extends AsyncTask<String,Void,List<Movie>>{

        @Override
        protected List<Movie> doInBackground(String... params) {
            try {
                InputStream inputStream=Utils.getInputStreamByPath(params[0]);
                if(inputStream!=null){
                    String json=Utils.getStringByInputStream(inputStream);
                    SystemClock.sleep(3000);
                    return  Utils.getListMovies(json);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(List<Movie> movies) {
            if(movies!=null){
                //将当前页的数据添加到大集合中
                 data.addAll(movies);
                if(adapter==null){
                    adapter=new MyAdapter(data);
                    listView_movies.setAdapter(adapter);
                }else{
                    //更新界面
                    adapter.notifyDataSetChanged();
                }
            }
        }
    }


    private final class MyAdapter extends BaseAdapter{

        private List<Movie> movies;
        private LayoutInflater layoutInflater;

        private ViewHolder viewHolder=null;

        public MyAdapter(List<Movie> movies) {
            this.movies=movies;

            layoutInflater=LayoutInflater.from(MainActivity.this);

        }

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

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Movie movie= movies.get(position);

            final String cover=movie.getCover();


            if(convertView==null){
                viewHolder=new ViewHolder();
                //将布局文件转换成View 对象
                convertView=layoutInflater.inflate(R.layout.movie_item,null);
                viewHolder.imageView_cover= (ImageView) convertView.findViewById(R.id.imageView_cover);
                viewHolder.textView_title= (TextView) convertView.findViewById(R.id.textView_title);

                convertView.setTag(viewHolder);

            }else{
                viewHolder= (ViewHolder) convertView.getTag();
            }


            viewHolder.imageView_cover.setTag(cover);

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

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

                @Override
                protected void onPostExecute(Bitmap bitmap) {
                    if(bitmap!=null){
                        Object localUrl=viewHolder.imageView_cover.getTag();
                        if(localUrl!=null && cover.equals(localUrl)){
                            viewHolder.imageView_cover.setImageBitmap(bitmap);
                        }

                    }
                }
            }


            new LoadImageAsyncTask().execute(cover);


            viewHolder.textView_title.setText(movie.getTitle());

            return convertView;
        }
    }

    class ViewHolder{
        ImageView imageView_cover;
        TextView textView_title;
    }
}

前台展示:

<1>一个movie_item展示

<2>一个footer_view展示

<3>一个activity_xml的展示


猜你喜欢

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