1. 程式人生 > >Xlistview上拉重新整理下拉載入+listview多條目無限輪播

Xlistview上拉重新整理下拉載入+listview多條目無限輪播

1.MainActivity頁面

package com.example.week2_01;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;

import com.example.Util.NetUtil;
import com.example.bean.BunnerBean;
import com.example.bean.NewsBean;

import me.maxwin.view.XListView;

public class MainActivity extends AppCompatActivity {
    private String bannerUrl="http://www.zhaoapi.cn/quarter/getAd";
    private String newUrl = "http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=%d&page=%d";
    private int mPage;
    private XListView xListView;
    private CountAdaper mAdaper;
    private final int LOAD_COUNT = 10;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPage = 1;
        //獲取資源id
        xListView = findViewById(R.id.xlistview);
        //建立介面卡
        mAdaper = new CountAdaper(this);
        xListView.setAdapter(mAdaper);
        //點選監聽
        xListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //跳轉
                Intent intent = new Intent(MainActivity.this,LoginActivity.class);
                //獲取值
                String name = mAdaper.getItem(position-1).getName();
                String summary = mAdaper.getItem(position-1).getSummary();
                //傳值
                intent.putExtra("name",name);
                intent.putExtra("summary",summary);
                //執行
                startActivity(intent);
            }
        });
        //設定支援載入
        xListView.setPullLoadEnable(true);
        //設定支援重新整理
        xListView.setPullRefreshEnable(true);
        //xlistview重新整理監聽
        xListView.setXListViewListener(new XListView.IXListViewListener() {
            //重新整理
            @Override
            public void onRefresh() {
                mPage = 1;
                //載入資料的方法
                loadData();
            }
            //載入
            @Override
            public void onLoadMore() {
                mPage++;
                //載入資料的方法
                loadData();
            }
        });
        loadData();
    }
    //載入資料的方法
    private void loadData() {
        if(mPage == 1){
            //載入banner的方法
            loadBunnerData();
            //載入新聞的方法
            loadNewData();
        }else{
            //載入新聞的方法
            loadNewData();
        }
    }

    private void loadNewData() {
        NetUtil.getInstance().getResult(String.format(newUrl, LOAD_COUNT, mPage), NewsBean.class, new NetUtil.CallBack<NewsBean>() {
            @Override
            public void onSuccess(NewsBean o) {
                if(mPage == 1){
                    //重新整理
                    mAdaper.setmResult(o.getResult());
                }else{
                    //載入
                    mAdaper.addResult(o.getResult());
                }
                //停止重新整理
                xListView.stopRefresh();
                //停止載入
                xListView.stopLoadMore();
                //判斷集合長度小於資料長度停止重新整理
                if(o.getResult().size()<LOAD_COUNT){
                    xListView.setPullLoadEnable(false);
                }
            }
        });
    }

    private void loadBunnerData() {
        NetUtil.getInstance().getResult(bannerUrl, BunnerBean.class, new NetUtil.CallBack<BunnerBean>() {
            @Override
            public void onSuccess(BunnerBean o) {
                mAdaper.setmBanner(o.getData());
            }
        });
    }
}

2.展示資料介面卡

package com.example.week2_01;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.bean.BunnerBean;
import com.example.bean.NewsBean;
import com.nostra13.universalimageloader.core.ImageLoader;

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

public class CountAdaper extends BaseAdapter {
    private List<BunnerBean.DataBean> mBanner;
    private List<NewsBean.ResultBean> mResult;
    private Context mContext;
    private final int ITEM_COUNT = 2;
    private final int ITEM_NEW = 0;
    private final int ITEM_BUNNER = 1;
    public CountAdaper(Context mContext) {
        this.mContext = mContext;
        //初始化
        mBanner = new ArrayList<>();
        mResult = new ArrayList<>();
    }
    //是否有banner
    public boolean hasBanner(){
        //返回長度大於0有bunner
        return mBanner.size()>0;
    }
    //更新banner
    public void setmBanner(List<BunnerBean.DataBean> banners){
        //清除資料
        mBanner.clear();
        if(banners!=null){
            //新增資料
            mBanner.addAll(banners);
        }
        //重新整理介面卡
        notifyDataSetChanged();
    }
    //更新新聞資料下拉重新整理
    public void setmResult(List<NewsBean.ResultBean> results){
        //清除資料
        mResult.clear();
        if(results!=null){
            //新增資料
            mResult.addAll(results);
        }
        //重新整理介面卡
        notifyDataSetChanged();
    }
    //追加新聞資料上拉載入
    public void addResult(List<NewsBean.ResultBean> results){
        if(results!=null){
            //新增重新整理的資料
            mResult.addAll(results);
        }
        //重新整理介面卡
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return hasBanner()?mResult.size()+1:mResult.size();
    }

    @Override
    public NewsBean.ResultBean getItem(int position) {
        return mResult.get(hasBanner()?position-1:position);
    }

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

    @Override
    public int getViewTypeCount() {
        return ITEM_COUNT;
    }

    @Override
    public int getItemViewType(int position) {
        return position == 0 && hasBanner()?ITEM_BUNNER:ITEM_NEW;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(getItemViewType(position) == ITEM_BUNNER) {
                BunnerViewHolder holder;
                if(convertView == null){
                    convertView = LayoutInflater.from(mContext).inflate(R.layout.bunneritem,parent,false);
                    holder = new BunnerViewHolder(convertView);
                }else{
                    holder = (BunnerViewHolder) convertView.getTag();
                }
                holder.bindBunner(mContext,mBanner);
        }else{
            NewViewHolder holder;
            if(convertView == null){
                convertView = LayoutInflater.from(mContext).inflate(R.layout.newsitem,parent,false);
                holder = new NewViewHolder(convertView);
            }else{
                holder = (NewViewHolder) convertView.getTag();
            }
                holder.bindResult(getItem(position));
        }
        return convertView;
    }
    //建立暫存器BunnerViewHolder
    class BunnerViewHolder{
            ViewPager viewPager;
            @SuppressLint("HandlerLeak")
            //建立Handler
            private Handler handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
                    handler.sendEmptyMessageDelayed(0,2000);
                }
            };
        //獲取資源id
        public BunnerViewHolder(View convertView) {
            viewPager = convertView.findViewById(R.id.viewpage);
            convertView.setTag(this);
        }
        //賦值
        public void bindBunner(Context context ,List<BunnerBean.DataBean> mBanner) {
            //先取消掉切換任務
            handler.removeCallbacksAndMessages(null);
            //將介面卡設定給viewPager
            viewPager.setAdapter(new BunnerAdaper(mBanner,context));
            //讓ViewPager位於中間
            viewPager.setCurrentItem(viewPager.getAdapter().getCount()/2);
            //開始輪播
            handler.sendEmptyMessageDelayed(0,2000);
        }

    }
    //建立暫存器NewViewHolder
    class NewViewHolder{
        ImageView image;
        TextView name,summary;
        //獲取資源id
        public NewViewHolder(View convertView) {
            image = convertView.findViewById(R.id.image);
            name = convertView.findViewById(R.id.name);
            summary = convertView.findViewById(R.id.summary);
            //設定tag
            convertView.setTag(this);
        }
        //賦值
        public void bindResult(NewsBean.ResultBean item) {
            name.setText(item.getName());
            summary.setText(item.getSummary());
            //設定圖片
            ImageLoader.getInstance().displayImage(item.getImageUrl(),image);
        }
    }
}

3.輪播圖介面卡

package com.example.week2_01;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.example.bean.BunnerBean;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.List;

public class BunnerAdaper extends PagerAdapter {
    private List<BunnerBean.DataBean> mData;
    private Context mContext;

    public BunnerAdaper(List<BunnerBean.DataBean> mData, Context mContext) {
        this.mData = mData;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return 5000;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        //建立imageview
        ImageView imageView = new ImageView(mContext);
        //設定可拉伸
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        //將imageview設定給ViewGroup
        container.addView(imageView);
        //設定圖片
        ImageLoader.getInstance().displayImage(mData.get(position%mData.size()).getIconNoHttps(),imageView);
        return imageView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        //刪除
        container.removeView((View) object);
    }
}

4.新聞Bean

package com.example.bean;

import java.util.List;

public class NewsBean {

    private List<ResultBean> result;

    public List<ResultBean> getResult() {
        return result;
    }

    public void setResult(List<ResultBean> result) {
        this.result = result;
    }

    public static class ResultBean {

        private boolean followMovie;
        private int id;
        private String imageUrl;
        private String name;
        private int rank;
        private String summary;

        public boolean isFollowMovie() {
            return followMovie;
        }

        public void setFollowMovie(boolean followMovie) {
            this.followMovie = followMovie;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getImageUrl() {
            return imageUrl;
        }

        public void setImageUrl(String imageUrl) {
            this.imageUrl = imageUrl;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getRank() {
            return rank;
        }

        public void setRank(int rank) {
            this.rank = rank;
        }

        public String getSummary() {
            return summary;
        }

        public void setSummary(String summary) {
            this.summary = summary;
        }
    }
}

5.輪播圖Bean

package com.example.bean;
import java.util.List;
public class BunnerBean {
    private List<DataBean> data;

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        private int aid;
        private String createtime;
        private String icon;
        private Object productId;
        private String title;
        private int type;
        private String url;

        public int getAid() {
            return aid;
        }

        public void setAid(int aid) {
            this.aid = aid;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public String getIcon() {
            return icon;
        }

        public void setIcon(String icon) {
            this.icon = icon;
        }
        public String getIconNoHttps(){
            return icon.replace("https","http");
        }

        public Object getProductId() {
            return productId;
        }

        public void setProductId(Object productId) {
            this.productId = productId;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

6.工具類

package com.example.Util;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;

import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class NetUtil {
    private static NetUtil instance;
    private Gson gson;
    //私有構造
    private NetUtil(){
        gson = new Gson();
    }
    //定義方法,獲取物件

    public static NetUtil getInstance() {
        if(instance == null){
            instance = new NetUtil();
        }
        return instance;
    }
    //執行一個網路請求 返回string
    public String getResult(String urlStr){
        String result = "";
        try {
            //定義url地址
            URL url = new URL(urlStr);
            //開啟連線
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            //設定超時
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(5000);
            //獲取請求碼
            int responseCode = urlConnection.getResponseCode();
            if(responseCode == 200){
                result = stream2String(urlConnection.getInputStream());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    //將位元組流轉換為字元流
    private String stream2String(InputStream inputStream) throws IOException {
        StringBuilder builder = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        for (String tmp = br.readLine();tmp!=null;tmp=br.readLine()){
            builder.append(tmp);
        }
        return builder.toString();
    }
    //解析json返回Bean
    public <E> E getResult(String urlStr,Class clazz){
        String result = getResult(urlStr);
       E e = (E) gson.fromJson(result,clazz);
        return e;
    }
    //定義一個介面
    public interface CallBack<E>{
        void onSuccess(E e);
    }
    //回撥呼叫
    @SuppressLint("StaticFieldLeak")
    public void getResult(String urlStr, final Class clazz, final CallBack callBack){
        new AsyncTask<String,Void,Object>(){
            @Override
            protected Object doInBackground(String... strings) {
                return getResult(strings[0],clazz);
            }

            @Override
            protected void onPostExecute(Object o) {
                callBack.onSuccess(o);
            }
        }.execute(urlStr);
    }
    //判斷網路是否可用
    public boolean hasNetWork(Context context){
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
        return activeNetworkInfo!=null&&activeNetworkInfo.isAvailable();
    }
}

7.Application初始化圖片

package com.example;

import android.app.Application;
import android.graphics.Bitmap;

import com.example.week2_01.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(this)
                //指sdcard的快取大小
                .diskCacheSize(50*1204*1204)
                //設定記憶體快取數量
                .memoryCacheSizePercentage(13)
                //設定圖片格式
                .defaultDisplayImageOptions(new DisplayImageOptions.Builder()
                        //啟用外存快取
                        .cacheOnDisk(true)
                        //啟用記憶體快取
                        .cacheInMemory(true)
                        //設定色彩模式
                        .bitmapConfig(Bitmap.Config.ARGB_4444)
                        //設定圖片Uri為空或是錯誤的時候顯示的圖片
                        .showImageForEmptyUri(R.mipmap.ic_launcher)
                        //設定圖片載入/解碼過程中錯誤時候顯示的圖片
                        .showImageOnFail(R.mipmap.ic_launcher)
                        //設定圖片在下載期間顯示的圖片
                        .showImageOnLoading(R.mipmap.ic_launcher)
                        //設定圖片格式
                        .displayer(new RoundedBitmapDisplayer(16))
                        .build())
                .build());
    }
}

8.跳轉展示詳情的Activity

package com.example.week2_01;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class LoginActivity extends AppCompatActivity {

    private TextView name;
    private TextView summary;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        //獲取資源id
        name = findViewById(R.id.text_name);
        summary = findViewById(R.id.text_summary);
        //接收值
        Intent intent = getIntent();
        name.setText(intent.getStringExtra("name"));
        summary.setText(intent.getStringExtra("summary"));
    }
}

9AndroidManifest.xml

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

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:name="com.example.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".LoginActivity"/>
    </application>

</manifest>