今天要做的就是使用RecyclerView获取后台数据并展示为头条新闻的样式。直接上图:
后台的数据格式:
1.xml中添加控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.HomeActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
2.创建recyclerview的item布局 recyclerview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="130dp"
android:layout_height="100dp"
android:id="@+id/image_item"
android:src="@drawable/sup_img"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="60dp"
android:textSize="20sp"
android:text="标题"
android:gravity="center"
android:id="@+id/title_item"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="12sp"
android:text="作者"
android:gravity="center"
android:id="@+id/author_item"/>
</LinearLayout>
</LinearLayout>
3.XXXactivity.java
public class HomeActivity extends Activity implements OnBannerListener {
private ArrayList<String> list_path;
//获取的json数据
public String data;
public String title;
public String images;
public String contents;
public String authors;
public RecyclerView recyclerview;
public List<Map<String,Object>> list=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initView();
recyclerview= findViewById(R.id.recy);
//获取数据
okhttpDate();
}
private void okhttpDate() {
Log.i("TAG","--ok-");
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(HttpManager.ArticleListUrl).build();
try {
Response sponse=client.newCall(request).execute();
data=sponse.body().string();
//解析
jsonJXDate(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void jsonJXDate(String data) {
if(data!=null) {
try {
JSONObject jsonObject = new JSONObject(data);
String datas = jsonObject.getString("result");
JSONArray array = new JSONArray(datas);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
title = object.getString("title");
images = object.getString("image");
contents = object.getString("content");
authors = object.getString("author");
Drawable drawable = loadImageFromNetwork(images);
Map<String, Object> map = new HashMap<>();
map.put("title", title);
map.put("images",drawable);
map.put("contents",contents);
map.put("authors",authors);
list.add(map);
}
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
//添加分割线
recyclerview.addItemDecoration(new DividerItemDecoration(
HomeActivity.this, DividerItemDecoration.VERTICAL));
recy_item_Adapter recy=new recy_item_Adapter(list,HomeActivity.this);
//设置布局显示格式
recyclerview.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
recyclerview.setAdapter(recy);
break;
}
}
};
private Drawable loadImageFromNetwork(String imageUrl)
{
Drawable drawable = null;
try {
// 可以在这里通过文件名来判断,是否本地有此图片
drawable = Drawable.createFromStream(
new URL(imageUrl).openStream(), "image.jpg");
} catch (IOException e) {
Log.d("test", e.getMessage());
}
if (drawable == null) {
Log.d("test", "null drawable");
} else {
Log.d("test", "not null drawable");
}
return drawable ;
}
}
4.创建recyclerview适配器recy_item_Adapter.java
public class recy_item_Adapter extends RecyclerView.Adapter<recy_item_Adapter.ViewHolder> {
public List<Map<String,Object>> list=new ArrayList<>();
public Context con;
public LayoutInflater inflater;
public recy_item_Adapter(List<Map<String,Object>> list, Context con){
this.con=con;
this.list=list;
inflater=LayoutInflater.from(con);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= inflater.inflate(R.layout.recyclerview_item,null);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.recy_title.setText(list.get(position).get("title").toString());
holder.recy_imageView.setImageDrawable((Drawable) list.get(position).get("images"));
holder.recy_author.setText(list.get(position).get("authors").toString());
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView recy_title;
public ImageView recy_imageView;
public TextView recy_author;
public ViewHolder(View itemView) {
super(itemView);
recy_title = itemView.findViewById(R.id.title_item);
recy_imageView = itemView.findViewById(R.id.image_item);
recy_author = itemView.findViewById(R.id.author_item);
}
}
}
5.记得开启网络权限