//首先添加依赖
//Recyclerview是listview的升级版
implementation 'com.android.support:recyclerview-v7:28.0.0'
//okhttp
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
//Glide请求网络图片
implementation 'com.github.bumptech.glide:glide:3.7.0'
//解析网络请求数据
implementation 'com.google.code.gson:gson:2.2.4'
//别忘添加权限
<uses-permission android:name="android.permission.INTERNET"/>
//布局
<?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=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#fff"
>
<Button
android:id="@+id/fan"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/fan"
android:layout_alignParentLeft="true"
/>
<TextView
android:text="今日头条"
android:textSize="25dp"
android:layout_marginLeft="250dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/xin"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/wei"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
//recycleview 布局
<?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"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/ic_launcher_background"
/>
<TextView
android:id="@+id/t1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我反问"
android:textSize="18sp"
android:layout_marginTop="20dp"
android:layout_marginLeft="110dp"
/>
<TextView
android:id="@+id/t2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风娃娃服"
android:textSize="10sp"
android:layout_marginTop="50dp"
android:layout_marginLeft="110dp"
/>
</RelativeLayout>
</LinearLayout>
//适配器
package com.example.zk2mn.adapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.zk2mn.MainActivity;
import com.example.zk2mn.R;
import com.example.zk2mn.bean.Person;
import java.util.ArrayList;
import java.util.List;
//继承recycleview的adapter方法
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
List<Person.DataBean> list;
MainActivity mMainActivity;
public MyAdapter(MainActivity mainActivity) {
mMainActivity = mainActivity;
list = new ArrayList<>();
}
//初始化布局文件
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = View.inflate(mMainActivity,R.layout.recyclerview_text,null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
//绑定数据
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
viewHolder.t1.setText(list.get(i).getAuthor_name());
viewHolder.t2.setText(list.get(i).getTitle());
//使用glide添加图片
Glide.with(mMainActivity).load(list.get(i).getThumbnail_pic_s()).into(viewHolder.image);
//设置点击删除事件
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int ps = viewHolder.getLayoutPosition();
mOnrecyclerview.setonclick(ps);
}
});
//设置长按删除事件
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int ps = viewHolder.getLayoutPosition();
mOnrecyclerview.setonlongclick(ps);
return false;
}
});
}
//返回数量
@Override
public int getItemCount() {
return list.size();
}
//设置添加数据的方法
public void setdate(List<Person.DataBean> datebean) {
list=datebean;
notifyDataSetChanged();
}
//里面初始化布局文件的属性
public class ViewHolder extends RecyclerView.ViewHolder {
TextView t1;
TextView t2;
ImageView image;
public ViewHolder(@NonNull View itemView) {
super(itemView);
t1 = itemView.findViewById(R.id.t1);
t2 = itemView.findViewById(R.id.t2);
image = itemView.findViewById(R.id.image);
}
}
//实现删除方法
public void remove(int i) {
list.remove(i);
notifyItemRemoved(i);
notifyDataSetChanged();
}
//定义一个接口
public interface Onrecyclerview{
//设置点击删除方法
void setonclick(int ps);
//设置长按删除方法
void setonlongclick(int ps);
}
//给他一个假对象
public Onrecyclerview mOnrecyclerview;
//返回一个设置方法 供他们调用
public void setOnrecyclerview(Onrecyclerview onrecyclerview){
this.mOnrecyclerview = onrecyclerview;
}
}
//解析接口的数据
package com.example.zk2mn.bean;
import java.util.List;
//解析出接口的数据
public class Person {
private String msg;
private int code;
private List<DataBean> data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* uniquekey : 1326bf3c4505783d4a964f81b6220e9d
* title : 美国被特朗普坑惨了!又有3个铁杆盟友公开唱对台戏!
* date : 2018-05-12 07:25
* category : 头条
* author_name : 大国军情
* url : http://mini.eastday.com/mobile/180512072544020.html
* thumbnail_pic_s : http://04.imgmini.eastday.com/mobile/20180512/20180512_fe1bf1b6ec00098f9455c84dc81e6763_cover_mwpm_03200403.jpg
* thumbnail_pic_s02 : http://04.imgmini.eastday.com/mobile/20180512/20180512_3f636fca330f2311583896aed3185196_cover_mwpm_03200403.jpg
* thumbnail_pic_s03 : http://04.imgmini.eastday.com/mobile/20180512/20180512_793fab03dadcd417bf2d8e5e1e48a0f5_cover_mwpm_03200403.jpg
*/
private String uniquekey;
private String title;
private String date;
private String category;
private String author_name;
private String url;
private String thumbnail_pic_s;
private String thumbnail_pic_s02;
private String thumbnail_pic_s03;
public String getUniquekey() {
return uniquekey;
}
public void setUniquekey(String uniquekey) {
this.uniquekey = uniquekey;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getAuthor_name() {
return author_name;
}
public void setAuthor_name(String author_name) {
this.author_name = author_name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getThumbnail_pic_s() {
return thumbnail_pic_s;
}
public void setThumbnail_pic_s(String thumbnail_pic_s) {
this.thumbnail_pic_s = thumbnail_pic_s;
}
public String getThumbnail_pic_s02() {
return thumbnail_pic_s02;
}
public void setThumbnail_pic_s02(String thumbnail_pic_s02) {
this.thumbnail_pic_s02 = thumbnail_pic_s02;
}
public String getThumbnail_pic_s03() {
return thumbnail_pic_s03;
}
public void setThumbnail_pic_s03(String thumbnail_pic_s03) {
this.thumbnail_pic_s03 = thumbnail_pic_s03;
}
}
}
//Http类实现网络请求
package com.example.zk2mn.httputils;
import com.example.zk2mn.bean.Person;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
//创建一个类 把网络请求的代码提出来
public class Http {
public void getData(String path){
//创建一个okhttp设置读取时间,连接时间
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build();
//创建一个request请求对象 url()里面放入接口
Request request = new Request.Builder()
.url(path)
.build();
//创建call对象
Call call = okHttpClient.newCall(request);
//实现异步方法
call.enqueue(new Callback() {
@Override//失败方法
public void onFailure(Call call, IOException e) {
}
@Override//成功调用的方法
public void onResponse(Call call, Response response) throws IOException {
//把数据封装为string类型
String str = response.body().string();
//调用getlist接口回调方法
mOnhttp.getlist(str);
}
});
}
//定义一个接口
public interface Onhttp{
//返回一个解析完数据的参数
void getlist(String string);
}
//假对象
Onhttp mOnhttp;
//实现构造方法
public Http(Onhttp onhttp) {
mOnhttp = onhttp;
}
}
//Mainactivity
package com.example.zk2mn;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Button;
import com.example.zk2mn.adapter.MyAdapter;
import com.example.zk2mn.bean.Person;
import com.example.zk2mn.httputils.Http;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,Http.Onhttp{
private Button fan;
private Button xin,hei;
private RecyclerView recy;
Http mHttp;
MyAdapter mMyAdapter;
List<Person.DataBean> list = new ArrayList<>();
String path = "http://www.xieast.com/api/news/news.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
mMyAdapter = new MyAdapter(this);
recy.setAdapter(mMyAdapter);
//给数据设置为listview视图
LinearLayoutManager maager = new LinearLayoutManager(this);
recy.setLayoutManager(maager);
//添加分割线
recy.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//调用adapter里面接口回调的方法
mMyAdapter.setOnrecyclerview(new MyAdapter.Onrecyclerview() {
@Override
public void setonclick(int ps) {
mMyAdapter.remove(ps);
}
@Override
public void setonlongclick(int ps) {
mMyAdapter.remove(ps);
}
});
}
private void initData() {
mHttp.getData(path);
}
private void initView() {
fan = (Button) findViewById(R.id.fan);
xin = (Button) findViewById(R.id.xin);
hei = findViewById(R.id.hei);
recy = (RecyclerView) findViewById(R.id.recy);
fan.setOnClickListener(this);
xin.setOnClickListener(this);
mHttp = new Http(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.fan:
finish();
break;
case R.id.xin:
//做平移动画,translationY,translationX new float[]{10f, 20f, 30f, 40f, 60f, 80f}
ObjectAnimator XAnimator = ObjectAnimator.ofFloat(xin, "translationX", 0f, -670f);
ObjectAnimator YAnimator = ObjectAnimator.ofFloat(xin, "translationY", 0f, 1110f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(xin, "alpha", 1f,0f,1f);
AnimatorSet set = new AnimatorSet();
set.play(XAnimator).with(YAnimator).with(alpha);
set.setDuration(3000);
set.start();
hei.setVisibility(View.VISIBLE);
break;
}
}
//解决内存泄漏的问题
@Override
protected void onDestroy() {
super.onDestroy();
mHttp = null;
}
@Override
public void getlist(String str) {
Person person = new Gson().fromJson(str, Person.class);
list = person.getData();
runOnUiThread(new Runnable() {
@Override
public void run() {
mMyAdapter.setdate(list);
}
});
}
}