1. 程式人生 > >RecyclerView+OKHttp+MVP網路資料請求,刪除條目

RecyclerView+OKHttp+MVP網路資料請求,刪除條目

//首先新增依賴

	//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;
    }
}