清单文件中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
依赖
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.okhttp3:okhttp:4.4.1'
implementation 'org.greenrobot:eventbus:3.3.1'
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testCompileOnly 'org.projectlombok:lombok:1.18.24'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"/>
</LinearLayout>
new_item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:orientation="horizontal"
android:layout_height="wrap_content">
<ImageView
android:layout_width="100dp"
android:layout_height="80dp"
android:id="@+id/new_image"
android:layout_gravity="center"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="null"
android:layout_gravity="center"
android:gravity="center"
android:id="@+id/new_title"
android:layout_marginTop="20dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="评论人数:"
android:textSize="16sp"
android:layout_marginStart="15dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="null"
android:layout_gravity="center"
android:id="@+id/new_comment"
android:textSize="16sp"
android:layout_marginTop="10dp"/>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="null"
android:textSize="16sp"
android:layout_marginStart="15dp"
android:layout_gravity="center"
android:id="@+id/new_time"
android:layout_marginTop="10dp"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"/>
</LinearLayout>
MainActivity
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import lombok.SneakyThrows;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private ListView listview;
private NewsItemAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
listview = (ListView) findViewById(R.id.listview);
adapter=new NewsItemAdapter(MainActivity.this);
listview.setAdapter(adapter);
inData();
}
private void inData() {
String url=OkhttpUtil.URL+OkhttpUtil.NEWS;
OkhttpUtil.getRequest(url, new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.e("msg",e.getMessage());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String json=response.body().string();
Log.d("msg",json);
bindData(json);
}
});
}
public void bindData(String json){
Message msg=new Message();
msg.obj=json;
msg.what=1;
mHandler.sendMessage(msg);
}
Handler mHandler=new Handler(new Handler.Callback() {
@SneakyThrows
@Override
public boolean handleMessage(@NonNull Message msg) {
if (msg.what==1){
String json=msg.obj.toString();
JSONObject jsonObject=new JSONObject(json);
JSONArray jsonArray=jsonObject.getJSONArray("rows");
List<NewsBean> list=JsonUtil.toList(jsonArray.toString(),NewsBean.class);
adapter.setData(list);
}
return false;
}
});
}
JsonUtil
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import java.util.ArrayList;
import java.util.List;
/**
* JSON解析类
* @author jack
*/
public class JsonUtil<T> {
public static <T> List<T> toList(String json, Class<T> cls){
List<T> list = new ArrayList<T>();
Gson gson = new Gson();
JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray();
for (JsonElement jsonElement: jsonArray) {
list.add(gson.fromJson(jsonElement, cls));
}
return list;
}
}
NewsBean
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class NewsBean implements Serializable {
/**
* searchValue : null
* createBy : 1
* createTime : 2021-05-08 09:57:54
* updateBy : 1
* updateTime : 2022-06-07 16:58:13
* remark : null
* params : {}
* id : 28
* appType : smart_city
* cover : /prod-api/profile/upload/image/2021/05/08/c044462a-2ce3-4f28-b2a3-908164b82498.jpg
* title : iPhone 13再爆猛料:不止刘海屏有望缩小,超大杯或将搭载LTPO屏
* subTitle : null
* content : <p> 按照去年iPhone 12系列的发布时间节点来看,如今距离苹果新一代iPhone发布的时间还有很长一段时间,但这并未能够阻挡消费者对于iPhone 13系列的关注热情。每当网上一有关于新机的爆料信息,总能引起了不少网友的围观与讨论</p><p><br></p><p> 就在近日,国外一数码博主便通过一则视频,向广大网友展示疑似iPhone 13 Pro Max的机模。根据该视频显示,全新的iPhone 13 Pro Max在外观上并没有做出太大的改变,依旧保持了刘海屏设计,同时后置依旧采用了三摄模组。区别的是,相较于上一代iPhone 13 Pro Max似乎机身厚度变大了些许,且摄像头模组的凸起程度也更高,而且正面的刘海屏也能感觉到明显变窄了不少。</p><p><br></p><p><img src="/prod-api/profile/upload/image/2021/05/17/863b3306-9fad-4255-a065-0f59b57c7cc4.jpg"></p><p> </p><p> 至于配置方面,iPhone 13 Pro Max有望搭载LTPO显示屏,借助于这一屏幕材质的特殊性,能够有效降低屏幕的功耗,iPhone 13 Pro Max大概率将会支持120Hz屏幕刷新率,从而拉开苹果手机的高刷屏序幕。此外,存储空间也或将升级至1TB内存。如果真的如此的话,那么对于广大果粉朋友来说,绝对算得上是近几年苹果带给用户最大的福音。</p><p><img src="/prod-api/profile/upload/image/2021/05/17/ec953328-80e2-457a-a18b-d61009a8e498.jpg"></p>
* status : Y
* publishDate : 2021-05-08
* tags : null
* commentNum : 836
* likeNum : 2230
* readNum : 2134
* type : 22
* top : N
* hot : N
*/
private Object searchValue;
private String createBy;
private String createTime;
private String updateBy;
private String updateTime;
private Object remark;
private ParamsBean params;
private int id;
private String appType;
private String cover;
private String title;
private Object subTitle;
private String content;
private String status;
private String publishDate;
private Object tags;
private int commentNum;
private int likeNum;
private int readNum;
private String type;
private String top;
private String hot;
@NoArgsConstructor
@Data
public static class ParamsBean {
}
}
NewsItemAdapter
import java.util.ArrayList;
import java.util.List;
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.bumptech.glide.Glide;
public class NewsItemAdapter extends BaseAdapter {
private List<NewsBean> objects = new ArrayList<NewsBean>();
private Context context;
private LayoutInflater layoutInflater;
public NewsItemAdapter(Context context) {
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
}
public void setData(List<NewsBean> objects){
this.objects=objects;
notifyDataSetChanged();
}
@Override
public int getCount() {
return objects.size();
}
@Override
public NewsBean getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.news_item, null);
convertView.setTag(new ViewHolder(convertView));
}
initializeViews((NewsBean)getItem(position), (ViewHolder) convertView.getTag());
return convertView;
}
private void initializeViews(NewsBean object, ViewHolder holder) {
//TODO implement
holder.newComment.setText(String.valueOf(object.getCommentNum()));
Glide.with(context).load(OkhttpUtil.URL+object.getCover()).into(holder.newImage);
holder.newTime.setText(object.getCreateTime());
holder.newTitle.setText(object.getTitle());
}
protected class ViewHolder {
private ImageView newImage;
private TextView newTitle;
private TextView newComment;
private TextView newTime;
public ViewHolder(View view) {
newImage = (ImageView) view.findViewById(R.id.new_image);
newTitle = (TextView) view.findViewById(R.id.new_title);
newComment = (TextView) view.findViewById(R.id.new_comment);
newTime = (TextView) view.findViewById(R.id.new_time);
}
}
}
OkhttpUtil
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
public class OkhttpUtil {
public static final String URL="http://124.93.196.45:10001";
public static final String NEWS="/prod-api/press/press/list";
public static void getRequest(String url, Callback callback){
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder().get().url(url).build();
okHttpClient.newCall(request).enqueue(callback);
}
}