RecyclerView+OKHttp+MVP網路資料請求,刪除條目
阿新 • • 發佈:2018-11-17
//首先新增依賴 //Recyclerview是listview的升級版 implementation 'com.android.support:recyclerview-v7:28.0.0' //okhttp implementation 'com.squareup.okhttp3:okhttp:3.10.0' //請求網路圖片 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 com.google.gson.Gson;
import java.io.IOException;
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 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();
//進行gson解析
Person person = new Gson().fromJson(str, Person.class);
//呼叫getlist介面回撥方法
mOnhttp.getlist(person.getData());
}
});
}
//定義一個介面
public interface Onhttp{
//返回一個解析完資料的引數
void getlist(List<Person.DataBean> list);
}
//假物件
Onhttp mOnhttp;
//實現一個方法 供他們呼叫
public void setOnhttp(Onhttp Onhttp){
this.mOnhttp = Onhttp;
}
}
//Mainactivity
package com.example.zk2mn;
import android.animation.ObjectAnimator;
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;
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);
mHttp.setOnhttp(new Http.Onhttp() {
@Override
public void getlist(final List<Person.DataBean> list) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mMyAdapter.setdate(list);
}
});
}
});
}
private void initView() {
fan = (Button) findViewById(R.id.fan);
xin = (Button) findViewById(R.id.xin);
recy = (RecyclerView) findViewById(R.id.recy);
fan.setOnClickListener(this);
xin.setOnClickListener(this);
mHttp = new Http();
}
@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 translationY = ObjectAnimator.ofFloat(xin, "translationY", new float[]{10f, 20f, 30f, 40f, 60f, 80f});
translationY.setDuration(2000);
translationY.setRepeatMode(ObjectAnimator.RESTART);
translationY.setRepeatCount(1);
translationY.start();
break;
}
}
@Override
public void getlist(final List<Person.DataBean> list) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mMyAdapter.setdate(list);
}
});
}
//解決記憶體洩漏的問題
@Override
protected void onDestroy() {
super.onDestroy();
mHttp = null;
}
}