mainActity
public class MainActivity extends AppCompatActivity {
private PullToRefreshScrollView psv;
private int pageIndex=1;
private int operType=1;//1:刷新 2:加载更多
private String myurl="http://365jia.cn/news/api3/365jia/news/headline?page="+pageIndex;
private List<ResultData.DataBeanX.DataBean> datas=new ArrayList<>();
private ListViewAdapter adapter;
private ListView listView;
private ViewPager viewPager;
private List<String> imgUrls=new ArrayList<>();
private LinearLayout linPoint;
private List<ImageView> lists=new ArrayList<>();
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int cIndex=viewPager.getCurrentItem();
cIndex++;
viewPager.setCurrentItem(cIndex);
//改变指示器
setSelectedPoint(cIndex%lists.size());
sendEmptyMessageDelayed(0,1000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
psv = findViewById(R.id.psv);
listView = findViewById(R.id.lv);
viewPager = findViewById(R.id.vp);
linPoint = findViewById(R.id.lin_point);
//初使化 pullToRefreshScrollView
initPsv();
//请求网络数据requestNetData();
}
private void requestNetData() {
new MyTask().execute(myurl);
}
class MyTask extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... strings) {
try {
URL url=new URL(strings[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(5000);
urlConnection.setConnectTimeout(5000);
if(urlConnection.getResponseCode()==200){
InputStream inputStream = urlConnection.getInputStream();
String s = streamToString(inputStream);
return s;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson=new Gson();
ResultData resultData = gson.fromJson(s, ResultData.class);
//新请求下来的数据
List<ResultData.DataBeanX.DataBean> data = resultData.getData().getData();
//展示轮播图
showPics(data);
if(operType==1){
datas.clear();//清空
}
datas.addAll(data);
setAdapter();
//关闭头尾布局
psv.onRefreshComplete();
}
}
private void showPics(List<ResultData.DataBeanX.DataBean> data) {
imgUrls.clear();
//为轮播图添加地址
imgUrls.add("http://365jia.cn/uploads/"+data.get(0).getPics().get(0));
imgUrls.add("http://365jia.cn/uploads/"+data.get(1).getPics().get(0));
imgUrls.add("http://365jia.cn/uploads/"+data.get(2).getPics().get(0));
MyVpAdapter adapter=new MyVpAdapter(imgUrls,MainActivity.this);
viewPager.setAdapter(adapter);
//初使化指示器
initPoint();
//发送消息,实现自动轮播
mHandler.sendEmptyMessageDelayed(0,1000);
}
//设置选中的小圆点
private void setSelectedPoint(int pageIndex){
for (int i = 0; i <lists.size() ; i++) {
if(i==pageIndex){
lists.get(i).setImageResource(R.drawable.point_selected);
}else {
lists.get(i).setImageResource(R.drawable.point_unselected);
}
}
}
private void initPoint() {
for (int i = 0; i <imgUrls.size() ; i++) {
ImageView imageView=new ImageView(this);
//设置它的布局参数
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0,0,10,0);//设置右边的间隔
if(i==0){
imageView.setImageResource(R.drawable.point_selected);//选中的小圆点
}else{
imageView.setImageResource(R.drawable.point_unselected);
}
linPoint.addView(imageView,params);
lists.add(imageView);
}
}
public void setAdapter(){
if (adapter == null) {
adapter = new ListViewAdapter(datas,MainActivity.this);
listView.setAdapter(adapter);
}else {
adapter.notifyDataSetChanged();
}
}
/**
* 将流转换成String
* @param stream
*/
private String streamToString(InputStream stream) {
StringBuilder sbuilder=new StringBuilder();
String str;
BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
try {
while ((str=reader.readLine())!=null){
sbuilder.append(str);
}
} catch (Exception e) {
e.printStackTrace();
}
return sbuilder.toString();
}
private void initPsv() {
//1.设置模式
psv.setMode(PullToRefreshBase.Mode.BOTH);
//2.设置监听
psv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ScrollView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ScrollView> pullToRefreshBase) {
//刷新回调
operType=1;
pageIndex=1;
myurl="http://365jia.cn/news/api3/365jia/news/headline?page="+pageIndex;
requestNetData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ScrollView> pullToRefreshBase) {
//加载回调
operType=2;
pageIndex++;
myurl="http://365jia.cn/news/api3/365jia/news/headline?page="+pageIndex;
requestNetData();
}
});
}
}
ListViewAdapter
public class ListViewAdapter extends BaseAdapter {
private List<ResultData.DataBeanX.DataBean> data;
private Context context;
public ListViewAdapter( List<ResultData.DataBeanX.DataBean> data, Context context) {
this.data = data;
this.context = context;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if(view==null){
view=View.inflate(context,R.layout.lvitem,null);
holder=new ViewHolder();
holder.textView=view.findViewById(R.id.tv);
view.setTag(holder);
}else {
holder= (ViewHolder) view.getTag();
}
holder.textView.setText(data.get(i).getTitle());
return view;
}
class ViewHolder{
TextView textView;
}
}
Application
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//自定义图片的缓存路径
File cachefile=new File( Environment.getExternalStorageDirectory().getPath()+"/abc");
ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽
.threadPoolSize(2)//线程池的数量
.threadPriority(4)
.memoryCacheSize(2*1024*1024)//设置内存缓存区大小
.diskCacheSize(20*1024*1024)//设置sd卡缓存区大小
.diskCache(new UnlimitedDiscCache(cachefile))//自定义缓存目录
.writeDebugLogs()//打印日志内容
.diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理
.build();
ImageLoader.getInstance().init(configuration);
}
}
Mylistview
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//重新计算高度
int newHeight=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, newHeight);
}
}
MyVpAdapter
public class MyVpAdapter extends PagerAdapter {
//数据源
private List<String> urls;
//上下文对象
private Context context;
private DisplayImageOptions options;
public MyVpAdapter(List<String> urls, Context context) {
this.urls = urls;
this.context = context;
this.options=new DisplayImageOptions.Builder()
.cacheInMemory(true)//使用内存缓存
.cacheOnDisk(true)//使用磁盘缓存
.showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片
.showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时
.showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片
.bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式 1px=2个字节 ARGB_8888 1px=4个字节 ARGB_4444 1px=2个字节 ALPHA_8 1px=1个字节
.imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式
.build();
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView=new ImageView(context);
//下载图片
ImageLoader.getInstance().displayImage(urls.get(position%urls.size()),imageView,options);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);
container.removeView((View)object);
}
}