1. 程式人生 > >Okhttp網路請求+Recyclerview展示資料

Okhttp網路請求+Recyclerview展示資料

首先匯入依賴

 	//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'
佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
  android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <Button
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="刪除"
            />
        <Button
            android:id="@+id/btn3"
            android:text="list"
            android:layout_weight="1"

            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/btn4"
            android:text="grid"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/btn5"
            android:text="flow"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/review"
        android:layout_width="match_parent"

        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="5dp"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="5dp">

        <ImageView
            android:id="@+id/img"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:text="Content"
            android:textAllCaps="false"
            />
    </LinearLayout>

</RelativeLayout>

介面卡

package com.example.day13;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.day13.bean.Person;

import java.util.ArrayList;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    Context mContext;
    List<Person.ResultBean> list;

    public MyAdapter(Context context) {
        this.mContext = context;
         list = new ArrayList<>();
    }
    

    //把解析出來的資料進行新增
    public void setData(List<Person.ResultBean> dataBeans) {
        for (int i = 0; i < dataBeans.size(); i++) {
            list.add(dataBeans.get(i));
        }
        //更新
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = View.inflate(mContext,R.layout.item,null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        viewHolder.tv.setText(list.get(i).getName());
        Glide.with(mContext).load(list.get(i).getImageUrl()).into(viewHolder.img);

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    //刪除資料
    public void delete(int i) {
        if(list.size()>0){
            list.remove(i);
            notifyDataSetChanged();
        }else{
            Toast.makeText(mContext,"沒有更多資料",Toast.LENGTH_SHORT).show();
        }
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView img;
        TextView tv;

        public ViewHolder(View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img);
            tv = itemView.findViewById(R.id.tv);
        }
    }

}

//單獨封裝一個網路請求類

package com.example.day13.http;

import android.content.Context;
import android.widget.Toast;
import com.example.day13.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 {

    Context mContext;
    public void getData(String url){
        final OkHttpClient okhttp = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .build();
        //構造一個Request物件
        Request request = new Request.Builder().url(url).build();
        //通過request的物件去構造得到一個Call物件
        Call call = okhttp.newCall(request);
        //呼叫的是call.enqueue,將call加入排程佇列,然後等待任務執行完成,我們在Callback中即可得到結果。
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Toast.makeText(mContext,"失敗嚕嚕嚕嚕",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String  s = response.body().string();
                Gson gson = new Gson();
                Person ladyBean = gson.fromJson(s, Person.class);
                mOnhttp.getlist(ladyBean.getResult());
            }
        });
    }

    public interface Onhttp{
        void getlist(List<Person.ResultBean> list);
    }

    Onhttp mOnhttp;

    public void setOnhttp(Onhttp Onhttp){
        this.mOnhttp = Onhttp;
    }
}

package com.example.day13;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.day13.bean.Person;
import com.example.day13.http.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 delete;
    private RecyclerView review;
    List<Person.ResultBean> list = new ArrayList<>();
    MyAdapter adapter;
    private Button btn3;
    private Button btn4;
    private Button btn5;
    Http http;
    int page = 1;
    private String url = "http://172.17.8.100/movieApi/movie/v1/findHotMovieList?page="+page+"&&count=10";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        adapter = new MyAdapter(this);
        review.setAdapter(adapter);
    }

    private void initDate() {
        http.getData(url);
        http.setOnhttp(this);
    }

    private void initView() {
        http = new Http();
        
        delete = (Button) findViewById(R.id.delete);
        review = (RecyclerView) findViewById(R.id.review);
        
        delete.setOnClickListener(this);
        btn3 = (Button) findViewById(R.id.btn3);
        btn3.setOnClickListener(this);
        btn4 = (Button) findViewById(R.id.btn4);
        btn4.setOnClickListener(this);
        btn5 = (Button) findViewById(R.id.btn5);
        btn5.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add:
                break;
            case R.id.delete:
                adapter.delete(0);
                break;
            case R.id.btn3:
                //listview檢視
               // Toast.makeText(MainActivity.this,"少時誦詩書",Toast.LENGTH_SHORT).show();
                LinearLayoutManager maager = new LinearLayoutManager(this);
                review.setLayoutManager(maager);
                initDate();
                break;
            case R.id.btn4:
                //網路檢視
                GridLayoutManager manager2 = new GridLayoutManager(this,4);
                review.setLayoutManager(manager2);
                break;
            case R.id.btn5:
                //瀑布檢視
                StaggeredGridLayoutManager manager1 = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); review.setLayoutManager(manager1);
                break;
        }
    }

    @Override
    public void getlist(final List<Person.ResultBean> list) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.setData(list);
            }
        });
    }
}