1布局页
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_listview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</android.support.constraint.ConstraintLayout>
2.多条目布局
2.1 一张图片
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/image1"
android:layout_width="140dp"
android:layout_height="120dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintRight_toLeftOf="@id/image1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="title"
android:maxLines="2"
/>
</android.support.constraint.ConstraintLayout>
2.2 三张图片
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:maxLines="2"
/>
<ImageView
android:id="@+id/image1"
android:layout_width="140dp"
android:layout_height="120dp"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<ImageView
android:id="@+id/image2"
android:layout_width="140dp"
android:layout_height="120dp"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintLeft_toRightOf="@id/image1"
app:layout_constraintRight_toLeftOf="@id/image3"
app:layout_constraintBottom_toBottomOf="parent"
/>
<ImageView
android:id="@+id/image3"
android:layout_width="140dp"
android:layout_height="120dp"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintLeft_toRightOf="@id/image2"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
</android.support.constraint.ConstraintLayout>
3.主代码页面
package com.example.guoxinyu20181122.ui.fragment;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
import com.example.guoxinyu20181122.R;
import com.example.guoxinyu20181122.Util.NetUtil;
import com.example.guoxinyu20181122.bean.NewBean;
import com.example.guoxinyu20181122.ui.adaper.HomeAdaper;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
public class HomeFragment extends BaseFragment {
private PullToRefreshListView refreshListView;
private HomeAdaper homeAdaper;
private String url = "http://api.tianapi.com/military/?key=605fa0a929c8d8b116424df0510c6b2a&num=10";
private int mpage;
@Override
protected void initData() {
NetUtil.getIntance().getRequest(url, NewBean.class, new NetUtil.CallBack<NewBean>() {
@Override
public void onSuccess(NewBean o) {
if(o==null || !o.isSuccess()){
Toast.makeText(getActivity(),"请求错误",Toast.LENGTH_SHORT).show();
refreshListView.onRefreshComplete();
return;
}
if(mpage == 1){
homeAdaper.setmData(o.getNewslist());
}else{
homeAdaper.addmData(o.getNewslist());
}
mpage++;
refreshListView.onRefreshComplete();
}
});
}
@Override
protected void initView(View view) {
mpage = 1;
//获取资源id
refreshListView = view.findViewById(R.id.pull_listview);
//创建适配器
homeAdaper = new HomeAdaper(getActivity());
refreshListView.setAdapter(homeAdaper);
refreshListView.setMode(PullToRefreshBase.Mode.BOTH);
refreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
mpage = 1;
initData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
initData();
}
});
}
@Override
protected int getLayoutResId() {
return R.layout.home_fragment;
}
}
4.适配器
package com.example.guoxinyu20181122.ui.adaper;
import android.content.Context;
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.guoxinyu20181122.R;
import com.example.guoxinyu20181122.bean.NewBean;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
public class HomeAdaper extends BaseAdapter {
private List<NewBean.NewslistBean> mData;
private Context mContext;
public HomeAdaper(Context mContext) {
this.mContext = mContext;
mData = new ArrayList<>();
}
public void setmData(List<NewBean.NewslistBean> mData) {
this.mData.clear();
if (mData != null) {
this.mData.addAll(mData);
}
notifyDataSetChanged();
}
public void addmData(List<NewBean.NewslistBean> mData) {
if (mData != null) {
this.mData.addAll(mData);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public NewBean.NewslistBean getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private final int ITEM_COUNT = 2;
@Override
public int getViewTypeCount() {
return ITEM_COUNT;
}
private final int IAMEG_ONE = 0;
private final int IAMEG_THREE = 1;
@Override
public int getItemViewType(int position) {
/*String picUrl = mData.get(position).getPicUrl();
String picUr2 = mData.get(position).getPicUrl();
if(picUrl!=null && picUr2!=null){
return IAMEG_THREE;
}else{
return IAMEG_ONE;
}*/
return mData.get(position).hasMultiPic() ? IAMEG_THREE : IAMEG_ONE;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
getItemViewType(position) == IAMEG_ONE ? R.layout.home_imageone_item : R.layout.home_imagethree_item
, parent, false);
holder = new ViewHolder(convertView);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.bind(getItem(position));
return convertView;
}
class ViewHolder {
ImageView image, image1, image2, image3;
TextView title;
public ViewHolder(View convertView) {
//image = convertView.findViewById(R.id.image);
image1 = convertView.findViewById(R.id.image1);
image2 = convertView.findViewById(R.id.image2);
image3 = convertView.findViewById(R.id.image3);
title = convertView.findViewById(R.id.title);
convertView.setTag(this);
}
public void bind(NewBean.NewslistBean item) {
title.setText(item.getTitle());
//ImageLoader.getInstance().displayImage(item.getPicUrl(), image);
ImageLoader.getInstance().displayImage(item.getPicUrl(), image1);
if(image2 != null && image3 != null) {
ImageLoader.getInstance().displayImage(item.getPicUrl(), image2);
ImageLoader.getInstance().displayImage(item.getPicUrl(), image3);
}
}
}
}
5.bean类
package com.example.guoxinyu20181122.bean;
import java.util.List;
import java.util.Random;
public class NewBean {
private int code;
private String msg;
private List<NewslistBean> newslist;
private final int SUCCESS_CODE=200;
public boolean isSuccess(){
return SUCCESS_CODE == code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<NewslistBean> getNewslist() {
return newslist;
}
public void setNewslist(List<NewslistBean> newslist) {
this.newslist = newslist;
}
public static class NewslistBean {
private String ctime;
private String title;
private String description;
private String picUrl;
private String url;
public String getCtime() {
return ctime;
}
public void setCtime(String ctime) {
this.ctime = ctime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
///////
private String picUrl2;
public String getPicUrl2() {
return picUrl2;
}
public boolean hasMultiPic() {
if(new Random().nextBoolean()) {
picUrl2 = picUrl;
}
return picUrl != null && picUrl2 != null;
}
}
}
6.工具类
package com.example.guoxinyu20181122.Util;
import android.annotation.SuppressLint;
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.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class NetUtil {
private static NetUtil intance;
private Gson gson;
public NetUtil() {
gson = new Gson();
}
public static NetUtil getIntance() {
if(intance == null){
intance = new NetUtil();
}
return intance;
}
//执行网络请求返回string
public String getRequest(String urlStr){
String result = "";
try {
URL url = new URL(urlStr);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
int responseCode = urlConnection.getResponseCode();
if(responseCode == 200){
result = stream2String(urlConnection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException 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();
}
public <E> E getRequest(String urlStr,Class clazz){
return (E) gson.fromJson(getRequest(urlStr),clazz);
}
public interface CallBack<E>{
void onSuccess(E e);
}
@SuppressLint("StaticFieldLeak")
public void getRequest(String urlStr, final Class clazz, final CallBack callBack){
new AsyncTask<String,Void,Object>(){
@Override
protected Object doInBackground(String... strings) {
return getRequest(strings[0],clazz);
}
@Override
protected void onPostExecute(Object o) {
callBack.onSuccess(o);
}
}.execute(urlStr);
}
}
7.Application初始化图片
package com.example.guoxinyu20181122.Application;
import android.app.Application;
import android.graphics.Bitmap;
import com.example.guoxinyu20181122.R;
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()
.bitmapConfig(Bitmap.Config.RGB_565)
.cacheOnDisk(true)
.cacheInMemory(true)
.showImageOnLoading(R.mipmap.ic_launcher)
.showImageOnFail(R.mipmap.ic_launcher)
.showImageForEmptyUri(R.mipmap.ic_launcher)
.build())
.build());
}
}