您的位置:首页 > 理论基础 > 计算机网络

android MVP+Retrofit2.0与RxJava网络请求数据,listview展示

2017-11-05 18:20 786 查看
android Retrofit2.0

Retrofit  电影:
https://api.douban.com/v2/movie/top250?start=0&count=10

一个用于Android和Java平台的类型安全的网络框架(是一套注解形式的网络请求封装库,REST API协议),Retrofit是一个Square开发的类型安全的REST安卓客户端请求库, 

为网络认证、API请求以及用OkHttp发送网络请求提供了强大的框架 。 

Retrofit 把REST API返回的数据转化为Java对象,就像ORM框架那样,把数据库内的存储的数据转化为相应的Java bean对象。

REST(Resources Representational State Transfer–资源表现层状态转化)是一组架构约束条件和原则。 

RESTful架构都满足以下规则: 

1、每一个URI代表一种资源; 

2、客户端和服务器之间,传递这种资源的某种表现层(“资源”具体呈现出来的形式,比如.txt,.png,.jpg) ; 

3、客户端通过四个HTTP动词(GET用来获取资源,POST用来新建或更新资源,PUT用来更新资源,DELETE用来删除资源),对服务器端资源进行操作,实现”表现层状态转化”。

这里附带::android模拟数据实现全选反选批量删除http://blog.csdn.net/qq_37199105/article/details/78463034 
 有兴趣的同学可以试试编辑数据。


1.build.gradle中添加依赖

compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'

//gson解析数据

compile 'com.google.code.gson:gson:2.6.2'

//注解
compile 'com.jakewharton:butterknife:7.0.1'

//图片
compile 'com.github.bumptech.glide:glide:3.7.0'


2.网络权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>


3.activity_main.xml布局,

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/id1"
android:layout_alignParentLeft="true"
<
10068
span style="color:#008000;">android:layout_alignParentStart="true">
</ListView>
item.xml子布局
<ImageView
android:layout_gravity="center"
android:id="@+id/iv"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
/>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_title"
android:layout_marginTop="15dp"
android:textSize="20dp"
android:text="这个杀手不太冷"
/>
<TextView
android:id="@+id/tv_name"
android:layout_marginTop="15dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="蒂姆·罗宾斯"
/>
</LinearLayout>
4.创建一个been类(SuperClass) ,这是接口地址(
http://api.expoon.com/
AppNews/getNewsList/type/1/p/1
5.Api和Apiserver
public class Api {
/*public static final String URL="http://tingapi.ting.baidu.com/";*/
public static final String URL="http://api.expoon.com/";
}
public interface ApiService {
/*@GET("v1/restserver/ting?method=baidu.ting.billboa.billList&type=1&size=10&offset=0")
Observable<Song> getSong();*/
@GET("AppNews/getNewsList/type/1/p/1")
Observable<SuperClass> getHome();
}
6.View类
public interface Iview {
void setUser(List<SuperClass.DataBean> list);
}

7.presenter类
public class Upresenter implements UserModel.OnFinish{

private final Iview userview;
private final UserModel userModel;

public Upresenter(Iview userview) {
this.userview = userview;
this.userModel = new UserModel();
userModel.setOnFinish(this);
}

public void setJson(String url){
userModel.getJson(url);
}

@Override
public void OnfinishListener(List<SuperClass.DataBean> list) {
userview.setUser(list);
}

}
8.model类
先写一个接口
public interface Imodel {
void getJson(String url);
}
public class UserModel implements Imodel{

List<SuperClass.DataBean> list = new ArrayList<>();

private OnFinish onFinish;

public interface OnFinish{
void OnfinishListener(List<SuperClass.DataBean> list);
}

public void setOnFinish(OnFinish finish){
this.onFinish = finish;
}

@Override
public void getJson(String url) {
//手动创建一个okhttpClient并设置超时时间
OkHttpClient okHttpClient = new OkHttpClient.Builder()
//添加拦截器
.addInterceptor(new LoggingInterceptor())
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();

//创建动态代理
ApiService apiService = retrofit.create(ApiService.class);
Observable<SuperClass> home = apiService.getHome();
home.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<SuperClass>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(SuperClass dataBean) {
list = (ArrayList<SuperClass.DataBean>) dataBean.getData();

onFinish.OnfinishListener(list);
}
});
}
}

9.Adapter类
public class HomeAdapter extends BaseAdapter {

private List<SuperClass.DataBean> lists;
private Context context;
public HomeAdapter(Context context,List<SuperClass.DataBean> lists) {
this.context = context;
this.lists = lists;
}

@Override
public int getCount() {
return lists == null ? 0 : lists.size();
}

@Override
public Object getItem(int i) {
return lists.get(i);
}

@Override
public long getItemId(int i) {
return i;
}

@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if (view == null){
view = LayoutInflater.from(context).inflate(R.layout.item, null);
holder=new ViewHolder();
holder.tv_title= (TextView) view.findViewById(R.id.tv_title);
holder.tv_name= (TextView) view.findViewById(R.id.tv_name);
holder.image = (ImageView) view.findViewById(R.id.iv);
view.setTag(holder);
}else {
holder= (ViewHolder) view.getTag();
}

holder.tv_title.setText(lists.get(i).getNews_title());
holder.tv_name.setText(lists.get(i).getNews_summary());
Glide.with(context).load(lists.get(i).getPic_url()).into(((ViewHolder) holder).image);

return view;
}
static class ViewHolder{
TextView tv_title;
TextView tv_name;
ImageView image;
}
}

10.MainActivity
public class MainActivity extends AppCompatActivity implements Iview {

Upresenter upresenter;
private ListView listView;
private List<SuperClass.DataBean> list;
private HomeAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

upresenter = new Upresenter(this);
upresenter.setJson(Api.URL);
listView = (ListView) findViewById(R.id.listview);

}

@Override
public void setUser(List<SuperClass.DataBean> list) {

adapter = new HomeAdapter(MainActivity.this,list);
listView.setAdapter(adapter);
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mvp 数据 listview