public class PullToRefreshListViewActivity extends AppCompatActivity {
public static final String TAG = PullToRefreshListViewActivity.class.getSimpleName(); // log 输出的tag
private static final int CODE_BANNER_INIT = 1; // 初始化轮播图数据的what
private static final int CODE_BANNER_START = 3; // 开始轮播的what
private static final int CODE_LIST = 2; // 列表数据的what
private PullToRefreshListView listView; // 展示数据刷新的ListView
private int pullNum = 1; // 请求的页码
/* api */
private String lunBoUrl = "http://api.iclient.ifeng.com/ClientNews?id=CJ33,FOCUSCJ33,HNCJ33&action=default&pullNum=";
private String listUrl = "http://api.iclient.ifeng.com/ClientNews?id=CJ33,FOCUSCJ33,HNCJ33&action=default&pullNum=";
private String listParam = "&uid=864678036850608&devid=864678036850608&proid=ifengnews&vt=5&publishid=6103&screen=1080x1920&df=androidphone&os=android_22&nw=wifi";
/* 轮播 */
private BannerViewPager bannerViewPager; // 轮播ViewPager
private LinearLayout llPonit; // 界面上展示小圆点的容器
private List<ImageView> ivImages = new ArrayList<>(); // 存放小圆点的容器
private TextView tvNum; // Banner上指示ViewPager数字的TextView
private TextView tvTitle; // Banner上显示标题的TextView
private BannerAdapter adapter; // 轮播适配器
private List<BannerBean.ItemBean> bannerBeans;
private List<ListBean.ItemBean> listItem = new ArrayList<>();
private PullListAdapter pullListAdapter = new PullListAdapter(PullToRefreshListViewActivity.this, listItem);
/* handler 把Thread中的数据展示到界面 */
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_BANNER_INIT: // 轮播
String luBoresult = (String) msg.obj;
Log.i(TAG, luBoresult);
Gson gson = new Gson();
LinkedList<BannerBean> lunBoBeans = gson.fromJson(luBoresult, new TypeToken<LinkedList<BannerBean>>() {
}.getType());
bannerBeans = lunBoBeans.get(0).getItem();
// 添加小圆点
for (int i = 0; i < bannerBeans.size(); i++) {
ImageView imageView = new ImageView(PullToRefreshListViewActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(40, 40);
params.setMargins(20, 10, 20, 10);
if (i == 0) {
imageView.setImageResource(R.drawable.point_red);
} else {
imageView.setImageResource(R.drawable.point_gray);
}
llPonit.addView(imageView, params);
ivImages.add(imageView);
}
// 设置轮播适配器
adapter = new BannerAdapter(PullToRefreshListViewActivity.this, bannerBeans, tvTitle, tvNum, ivImages);
bannerViewPager.setAdapter(adapter);
sendEmptyMessageDelayed(CODE_BANNER_START, 2000);
break;
case CODE_LIST: // 列表数据
if (pullNum == 1) {
listItem.clear();
}
String listResult = (String) msg.obj;
Log.i(TAG, listResult);
Gson listGson = new Gson();
LinkedList<ListBean> listBeans = listGson.fromJson(listResult, new TypeToken<LinkedList<ListBean>>() {
}.getType());
listItem.addAll(listBeans.get(0).getItem());
pullListAdapter.notifyDataSetChanged();
listView.onRefreshComplete();
break;
case CODE_BANNER_START: // 开始轮播
int currentItem = bannerViewPager.getCurrentItem();
bannerViewPager.setCurrentItem(currentItem + 1);
sendEmptyMessageDelayed(CODE_BANNER_START, 2000);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_to_refresh_listview);
// 6.0动态权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 200);
}
listView = findViewById(R.id.pull_to_refresh);
ListView refreshableView = listView.getRefreshableView();
// 设置参数
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
View headView = View.inflate(this, R.layout.list_head, null);
bannerViewPager = headView.findViewById(R.id.lun_bo);
llPonit = headView.findViewById(R.id.ll_point);
tvNum = headView.findViewById(R.id.tv_num);
tvTitle = headView.findViewById(R.id.tv_title);
// 给HeadView设置参数
headView.setLayoutParams(params);
refreshableView.addHeaderView(headView);
listView.setMode(PullToRefreshBase.Mode.BOTH);
listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
pullNum = 1;
new ListThread().start();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
pullNum++;
new ListThread().start();
}
});
listView.setAdapter(pullListAdapter);
new LunBoThread().start();
new ListThread().start();
}
class LunBoThread extends Thread {
@Override
public void run() {
get(lunBoUrl + pullNum, CODE_BANNER_INIT);
}
}
/**
* 流转换
*
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2String(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = -1;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
outputStream.write(b, 0, len);
}
return new String(outputStream.toByteArray());
}
/**
* 请求列表数据
*/
class ListThread extends Thread {
@Override
public void run() {
get(listUrl + pullNum + listParam, CODE_LIST);
}
}
/**
* get获取数据
*
* @param spec 要获取数据的地址
* @param messageCode Handler处理消息的what
*/
private void get(String spec, int messageCode) {
try {
URL url = new URL(spec);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
if (connection.getResponseCode() == 200) {
String result = inputStream2String(connection.getInputStream());
Message message = Message.obtain();
message.what = messageCode;
message.obj = result;
mHandler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static final String TAG = PullToRefreshListViewActivity.class.getSimpleName(); // log 输出的tag
private static final int CODE_BANNER_INIT = 1; // 初始化轮播图数据的what
private static final int CODE_BANNER_START = 3; // 开始轮播的what
private static final int CODE_LIST = 2; // 列表数据的what
private PullToRefreshListView listView; // 展示数据刷新的ListView
private int pullNum = 1; // 请求的页码
/* api */
private String lunBoUrl = "http://api.iclient.ifeng.com/ClientNews?id=CJ33,FOCUSCJ33,HNCJ33&action=default&pullNum=";
private String listUrl = "http://api.iclient.ifeng.com/ClientNews?id=CJ33,FOCUSCJ33,HNCJ33&action=default&pullNum=";
private String listParam = "&uid=864678036850608&devid=864678036850608&proid=ifengnews&vt=5&publishid=6103&screen=1080x1920&df=androidphone&os=android_22&nw=wifi";
/* 轮播 */
private BannerViewPager bannerViewPager; // 轮播ViewPager
private LinearLayout llPonit; // 界面上展示小圆点的容器
private List<ImageView> ivImages = new ArrayList<>(); // 存放小圆点的容器
private TextView tvNum; // Banner上指示ViewPager数字的TextView
private TextView tvTitle; // Banner上显示标题的TextView
private BannerAdapter adapter; // 轮播适配器
private List<BannerBean.ItemBean> bannerBeans;
private List<ListBean.ItemBean> listItem = new ArrayList<>();
private PullListAdapter pullListAdapter = new PullListAdapter(PullToRefreshListViewActivity.this, listItem);
/* handler 把Thread中的数据展示到界面 */
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_BANNER_INIT: // 轮播
String luBoresult = (String) msg.obj;
Log.i(TAG, luBoresult);
Gson gson = new Gson();
LinkedList<BannerBean> lunBoBeans = gson.fromJson(luBoresult, new TypeToken<LinkedList<BannerBean>>() {
}.getType());
bannerBeans = lunBoBeans.get(0).getItem();
// 添加小圆点
for (int i = 0; i < bannerBeans.size(); i++) {
ImageView imageView = new ImageView(PullToRefreshListViewActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(40, 40);
params.setMargins(20, 10, 20, 10);
if (i == 0) {
imageView.setImageResource(R.drawable.point_red);
} else {
imageView.setImageResource(R.drawable.point_gray);
}
llPonit.addView(imageView, params);
ivImages.add(imageView);
}
// 设置轮播适配器
adapter = new BannerAdapter(PullToRefreshListViewActivity.this, bannerBeans, tvTitle, tvNum, ivImages);
bannerViewPager.setAdapter(adapter);
sendEmptyMessageDelayed(CODE_BANNER_START, 2000);
break;
case CODE_LIST: // 列表数据
if (pullNum == 1) {
listItem.clear();
}
String listResult = (String) msg.obj;
Log.i(TAG, listResult);
Gson listGson = new Gson();
LinkedList<ListBean> listBeans = listGson.fromJson(listResult, new TypeToken<LinkedList<ListBean>>() {
}.getType());
listItem.addAll(listBeans.get(0).getItem());
pullListAdapter.notifyDataSetChanged();
listView.onRefreshComplete();
break;
case CODE_BANNER_START: // 开始轮播
int currentItem = bannerViewPager.getCurrentItem();
bannerViewPager.setCurrentItem(currentItem + 1);
sendEmptyMessageDelayed(CODE_BANNER_START, 2000);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_to_refresh_listview);
// 6.0动态权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 200);
}
listView = findViewById(R.id.pull_to_refresh);
ListView refreshableView = listView.getRefreshableView();
// 设置参数
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
View headView = View.inflate(this, R.layout.list_head, null);
bannerViewPager = headView.findViewById(R.id.lun_bo);
llPonit = headView.findViewById(R.id.ll_point);
tvNum = headView.findViewById(R.id.tv_num);
tvTitle = headView.findViewById(R.id.tv_title);
// 给HeadView设置参数
headView.setLayoutParams(params);
refreshableView.addHeaderView(headView);
listView.setMode(PullToRefreshBase.Mode.BOTH);
listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
pullNum = 1;
new ListThread().start();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
pullNum++;
new ListThread().start();
}
});
listView.setAdapter(pullListAdapter);
new LunBoThread().start();
new ListThread().start();
}
class LunBoThread extends Thread {
@Override
public void run() {
get(lunBoUrl + pullNum, CODE_BANNER_INIT);
}
}
/**
* 流转换
*
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2String(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = -1;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
outputStream.write(b, 0, len);
}
return new String(outputStream.toByteArray());
}
/**
* 请求列表数据
*/
class ListThread extends Thread {
@Override
public void run() {
get(listUrl + pullNum + listParam, CODE_LIST);
}
}
/**
* get获取数据
*
* @param spec 要获取数据的地址
* @param messageCode Handler处理消息的what
*/
private void get(String spec, int messageCode) {
try {
URL url = new URL(spec);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
if (connection.getResponseCode() == 200) {
String result = inputStream2String(connection.getInputStream());
Message message = Message.obtain();
message.what = messageCode;
message.obj = result;
mHandler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}