版权声明:叮叮叮!!!! https://blog.csdn.net/Xuexx_520/article/details/83148266
布局开始
此处只有xlistview的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/icon"
android:layout_width="140dp"
android:layout_height="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="title"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/icon"
app:layout_constraintTop_toTopOf="@id/icon"
/>
<TextView
android:id="@+id/summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/icon"
app:layout_constraintBottom_toBottomOf="@id/icon"
android:maxLines="2"
android:text="摘要"
/>
</android.support.constraint.ConstraintLayout>
MainActivity
package com.xxx.zkb2.activity;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.example.mylibrary.me.maxwin.view.XListView;
import com.example.xxx.zkb2.R;
import com.google.gson.Gson;
import com.xxx.zkb2.adapter.NewsAdapter;
import com.xxx.zkb2.model.Banner;
import com.xxx.zkb2.model.News;
import com.xxx.zkb2.utils.HttpUtil;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
/*private ArrayList<News.ResultBean> newslist;
private ArrayList<Banner.DataBean> bannerlist;*/
private XListView xlv;
private NewsAdapter newsAdapter;
//每次加载10条
private int loadItemCount = 2;
//初始页面
private int page=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//查找资源id
xlv=findViewById(R.id.xlv);
//初始化集合
/* newslist=new ArrayList<News.ResultBean>();
bannerlist=new ArrayList<Banner.DataBean>();*/
//添加适配器(bannerlist是添加在adapter第一条数据中)
newsAdapter=new NewsAdapter(MainActivity.this);
xlv.setAdapter(newsAdapter);
//设置xlistview事件
xlv.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
page=1;
//加载轮播图片
loadBannerData();
//加载新闻
loadNewsData(page);
}
@Override
public void onLoadMore() {
loadNewsData(page);
}
});
//一进来默认可以加载更多
setCanLoadMore(true);
//一进来就加载:Banner数据和列表数据
loadBannerData();
loadNewsData(page);
}
//获得轮播图片数据
private void loadBannerData() {
String path="http://www.zhaoapi.cn/quarter/getAd";
new AsyncTask<String,Void,List<Banner.DataBean>>(){
@Override
protected List<Banner.DataBean> doInBackground(String... strings) {
String textString=HttpUtil.HttpUrlConnection(strings[0]);
Banner banner=new Gson().fromJson(textString,Banner.class);
return banner==null?null:banner.getData();
}
@Override
protected void onPostExecute(List<Banner.DataBean> dataBeans) {
super.onPostExecute(dataBeans);
//更新banner数据
newsAdapter.setbannerData(dataBeans);
}
}.execute(path);
}
//每次更新追加完数据停止刷新,停止加载
private void loadDataCompleted() {
page++;
xlv.stopLoadMore();
xlv.stopRefresh();
}
//获得新闻数据
@SuppressLint("StaticFieldLeak")
private void loadNewsData(final int page) {
Log.e("page", page+"" );
final String path="http://172.17.8.100/movieApi/movie/v1/findHotMovieList?page="+page+"&count="+loadItemCount;
new AsyncTask<String,Void,ArrayList<News.ResultBean>>(){
@Override
protected ArrayList<News.ResultBean> doInBackground(String... strings) {
String textString= HttpUtil.HttpUrlConnection(strings[0]);
Gson gson=new Gson();
News news=gson.fromJson(textString,News.class);
return news==null?null: (ArrayList<News.ResultBean>) news.getResult();
}
@Override
protected void onPostExecute(ArrayList<News.ResultBean> resultBeans) {
super.onPostExecute(resultBeans);
if(resultBeans==null){
Toast.makeText(MainActivity.this,"请求新闻数据失败",Toast.LENGTH_SHORT).show();
return;
}
updateData(resultBeans);
//通知加载数据完成
loadDataCompleted();
//是否可以加载更多:加载列表数据不够loadItemCount则认为没有下一页数据
setCanLoadMore(resultBeans.size()>=loadItemCount);
//newslist.clear();
}
}.execute(path);
}
//是否可以加载更多
private void setCanLoadMore(boolean b) {
xlv.setPullLoadEnable(b);
}
private void updateData(ArrayList<News.ResultBean> resultBeans) {
if(page==1){
//更新新闻数据
newsAdapter.setNewsData(resultBeans);
} else {
//追加新闻数据
newsAdapter.addNewsData(resultBeans);
}
}
}
接下来是Adapter类
其中轮播图适配器BannerAdapter省略
NewsAdapter,多列表,判断是否有Banner数据,有的话,集合数量+1。
package com.xxx.zkb2.adapter;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.xxx.zkb2.R;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.xxx.zkb2.activity.MainActivity;
import com.xxx.zkb2.model.Banner;
import com.xxx.zkb2.model.News;
import java.util.ArrayList;
import java.util.List;
public class NewsAdapter extends BaseAdapter{
private MainActivity mainActivity;
private ArrayList<News.ResultBean> newslist;
private ArrayList<Banner.DataBean> bannerlist;
BannerViewHolder bh;
public NewsAdapter(MainActivity mainActivity) {
this.mainActivity = mainActivity;
newslist=new ArrayList<>();
bannerlist=new ArrayList<>();
}
/**
* 更新 列表 数据
* @param
*/
public void setNewsData(ArrayList<News.ResultBean> resultBeans) {
newslist.clear();
newslist.addAll(resultBeans);
notifyDataSetChanged();
}
/**
* 添加 列表 数据
* @param
*/
public void addNewsData(ArrayList<News.ResultBean> resultBeans) {
newslist.addAll(resultBeans);
notifyDataSetChanged();
}
/**
* 更新 Banner 数据
* @param
*/
public void setbannerData(List<Banner.DataBean> dataBeans) {
newslist.clear();
bannerlist.addAll(dataBeans);
notifyDataSetChanged();
}
private boolean hasBanner() {
return bannerlist.size() > 0;
}
@Override
public int getItemViewType(int position) {
//有banner 且 position == 0 则是Banner数据
//0代表banner,1代表新闻列表
return hasBanner()&&position==0?0:1;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount()+1;
}
@Override
public int getCount() {
//如果有Banner,则需要展示Banner数据,因此+1
return newslist.size()+(hasBanner()?1:0);
}
@Override
public Object getItem(int position) {
if(hasBanner() && position == 0) {
return null;
}
//如果有banner,第一条是Banner数据。因此真正的数据从position -1开始
return newslist.get(hasBanner()?position-1:position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(getItemViewType(position)==0){//banner
if(convertView==null){
bh = new BannerViewHolder();
convertView=View.inflate(mainActivity, R.layout.banner,null);
bh.viewPager=convertView.findViewById(R.id.viewpager);
convertView.setTag(bh);
} else {
bh= (BannerViewHolder) convertView.getTag();
}
bh.viewPager.setAdapter(new BannerAdapter(mainActivity,bannerlist));
//清除之前handler发送的消息
handler.removeCallbacksAndMessages(null);
//发送请求
handler.sendEmptyMessageDelayed(0,2000);
} else {//news
ListViewHolder lh = new ListViewHolder();
if (convertView == null) {
convertView=View.inflate(mainActivity,R.layout.lv_item,null);
lh.title = convertView.findViewById(R.id.title);
lh.summary = convertView.findViewById(R.id.summary);
lh.icon = convertView.findViewById(R.id.icon);
convertView.setTag(lh);
} else {
lh = (ListViewHolder) convertView.getTag();
}
News.ResultBean data= (News.ResultBean) getItem(position);
lh.title.setText(data.getName());
lh.summary.setText(data.getSummary());
ImageLoader.getInstance().displayImage(data.getImageUrl(),lh.icon);
}
return convertView;
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
int positon=bh.viewPager.getCurrentItem();
positon++;
bh.viewPager.setCurrentItem(positon);
handler.sendEmptyMessageDelayed(0,2000);
break;
}
}
};
class BannerViewHolder {
private ViewPager viewPager;
}
class ListViewHolder {
private ImageView icon;
private TextView title;
private TextView summary;
}
}
轮播图和新闻的Bean类省略
ImageLoader,加载图片
package com.xxx.zkb2;
import android.app.Application;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoader.getInstance().init(
new ImageLoaderConfiguration.Builder(this)
.memoryCacheSizePercentage(10)
.diskCacheSize(50*1024*1024)
.defaultDisplayImageOptions(new DisplayImageOptions.Builder()
.cacheOnDisk(true)
.cacheInMemory(true)
.bitmapConfig(Bitmap.Config.ARGB_4444)
.build()
)
.build()
);
}
}
效果图如下