版权声明:叮叮叮!!!! https://blog.csdn.net/Xuexx_520/article/details/83027694
开始布局
两个接口为头条,国内。需要加载完头条数据,再展示国内数据
头条布局如下(不带图片)
<?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"
android:padding="16dp"
>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="标题"
android:textColor="#000"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@id/author"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<TextView
android:id="@+id/author"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="作者"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
/>
</android.support.constraint.ConstraintLayout>
国内布局如下(包含图片)
<?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"
android:padding="16dp"
>
<ImageView
android:id="@+id/iv"
android:layout_width="160dp"
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="标题"
android:textColor="#000"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@id/author"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/iv"
app:layout_constraintTop_toTopOf="parent"
/>
<TextView
android:id="@+id/author"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="作者"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/iv"
app:layout_constraintTop_toBottomOf="@id/title"
/>
</android.support.constraint.ConstraintLayout>
activity-main只有一个listview
java代码
package com.bwie.xuexinxin;
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.ListView;
import com.google.gson.Gson;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtilsHC4;
import java.io.IOException;
import java.util.ArrayList;
import adapter.MAdapter;
import bean.News;
public class MainActivity extends AppCompatActivity {
private MAdapter ma;
private ListView lv;
private ArrayList<News.ResultBean.DataBean> list;
News news;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=findViewById(R.id.lv);
list=new ArrayList<News.ResultBean.DataBean>();
ma=new MAdapter(MainActivity.this,list);
lv.setAdapter(ma);
//获取网络数据
loadData();
}
private void loadData() {
@SuppressLint("StaticFieldLeak") AsyncTask<String,String,ArrayList<News.ResultBean.DataBean>> asyncTask=new AsyncTask<String, String, ArrayList<News.ResultBean.DataBean>>() {
@Override
protected ArrayList<News.ResultBean.DataBean> doInBackground(String... strings) {
//1 创建client
CloseableHttpClient httpClient= HttpClients.createDefault();
for (String url:strings){
//2.创建请求
HttpUriRequest request =RequestBuilder.get().setUri(url).build();
try {
//3 执行请求
CloseableHttpResponse response=httpClient.execute(request);
//4.获取响应结果
int statusCode=response.getStatusLine().getStatusCode();
if(statusCode==200){
publishProgress("获取: " + url + "响应成功");
String textString= EntityUtilsHC4.toString(response.getEntity());
Gson gson=new Gson();
news=gson.fromJson(textString,News.class);
ArrayList<News.ResultBean.DataBean> data= (ArrayList<News.ResultBean.DataBean>) news.getResult().getData();
list.addAll(data);
publishProgress("获取: " + url + "数据成功");
} else {
publishProgress("获取: " + url + "响应失败");
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Log.e("TEST", "任务进度更新: " + values[0]);
}
//数据传递到主线程,更新UI
protected void onPostExecute(ArrayList<News.ResultBean.DataBean> dataBeans) {
super.onPostExecute(dataBeans);
ma.notifyDataSetChanged();
}
};
//两个接口
asyncTask.execute(
"http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=tt",
"http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=gn"
);
}
}
ImageLoad配置代码
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoader.getInstance().init(ImageloadConfigs.getCon(this));
}
}
public static ImageLoaderConfiguration getCon(Context context) {
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
//内在缓存额外选项, 最大的宽度,高度
//.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
//.diskCacheExtraOptions(480, 800, null) // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
//线程池配置
//.taskExecutor()
//.taskExecutorForCachedImages()
//.threadPoolSize(3) // default 线程池内加载的数量
//.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
//任务处理优先级 Fist In Fist Out
//.tasksProcessingOrder(QueueProcessingType.FIFO) // default
//内存中不缓存一张图片的多个尺寸大小
//.denyCacheImageMultipleSizesInMemory()
//内在缓存策略
//.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
//内存缓存大小
//.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
//内在缓存大小:占用百分比
.memoryCacheSizePercentage(13) // default
//磁盘缓存策略
//.diskCache(new LruDiskCache()) // default 可以自定义缓存路径
//磁盘缓存大小
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
//.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
//.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
//.imageDownloader(new BaseImageDownloader(context)) // default
//(new BaseImageDecoder(false)) // default
//加载具体图片时的一些配置
//.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.defaultDisplayImageOptions(getOps)
//缓存图片到指定文件夹
File file=new File(Environment.getExternalStorageDirectory().getPath()+"/imagefile")
.diskCache(new UnlimitedDiskCache(file))
.writeDebugLogs() // 打印debug log
.build();
return configuration;
}
public static DisplayImageOptions getOps(Context context) {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
//是否缓存
.cacheInMemory(true)
.cacheOnDisk(true)
//RGB 565 r红色占5 g绿色占6 b蓝色占5 -> 2字节
//alpha
//ARGB 4444 4 4 4 4 -> 2字节
//ARGB 8888 -> 4字节
//10 * 10 用rgb565 -> 10*10*2
.bitmapConfig(Bitmap.Config.RGB_565)
//加载时、加载错误时展示什么内容
.showImageOnLoading(R.mipmap.ic_launcher)
.showImageOnFail(R.mipmap.ic_launcher)
//
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
//加载效果
//ctrl + p
.displayer(new CircleBitmapDisplayer())
.build();
//ctrl + h
//BitmapDisplayer;
return displayImageOptions;
}
Adapter多加了getItemViewType和getViewTypeCount()方法进行多条目加载
package adapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bwie.xuexinxin.ImageloadConfigs;
import com.bwie.xuexinxin.MainActivity;
import com.bwie.xuexinxin.R;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import bean.News;
public class MAdapter extends BaseAdapter{
private MainActivity mainActivity;
private ArrayList<News.ResultBean.DataBean> list;
public MAdapter(MainActivity mainActivity, ArrayList<News.ResultBean.DataBean> list) {
this.mainActivity = mainActivity;
this.list = list;
}
//当前item是什么类型
@Override
public int getItemViewType(int position) {
News.ResultBean.DataBean data= (News.ResultBean.DataBean) getItem(position);
//头条类型
if(data.isTT()){
return super.getItemViewType(position);
}
//国内类型
if (data.isCN()) {
return 1;
}
return 1;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount()+1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh=null;
if(convertView==null){
convertView=View.inflate(mainActivity,getItemViewType(position)==0?R.layout.tt_item:R.layout.gn_item,null);
vh=new ViewHolder(convertView);
} else {
vh= (ViewHolder) convertView.getTag();
}
News.ResultBean.DataBean data= (News.ResultBean.DataBean) getItem(position);
vh.bindData(data);
return convertView;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder {
TextView title;
TextView author;
ImageView iv;
public ViewHolder(View viewItem) {
title=viewItem.findViewById(R.id.title);
author=viewItem.findViewById(R.id.author);
//国内
iv=viewItem.findViewById(R.id.iv);
viewItem.setTag(this);
}
public void bindData(News.ResultBean.DataBean data){
title.setText(data.getTitle());
author.setText(data.getAuthor_name());
if(data.isCN()){
ImageLoader.getInstance().displayImage(data.getThumbnail_pic_s(),iv, ImageloadConfigs.getOps(mainActivity));
}
}
}
}
效果: