一,首先看一下案例结构
二,导入fresco依赖
compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.7.0' compile 'com.facebook.fresco:fresco:0.9.0+' implementation files('libs/gson-2.3.1.jar')
三,拿到接口原始数据创建好bean包
四,创建好MVP结构
1,本文使用封装好的OK请求网络数据。
okhttp包中
/** * Created by muhanxi on 17/11/10. * * * Okhttp 单例 范型的封装 */ public abstract class AbstractUiCallBack<T> implements Callback { /** * 成功回调 * @param t */ public abstract void success(T t); /** * 失败回调 * @param e */ public abstract void failure(Exception e); private Handler handler = null ; private Class clazz ; public AbstractUiCallBack(){ handler = new Handler(Looper.getMainLooper()); // 得到的是一个 AbstractUiCallBack<T> 的Type Type type = getClass().getGenericSuperclass() ; // 得到的是T的实际Type Type [] arr = ((ParameterizedType)type).getActualTypeArguments() ; clazz = (Class) arr[0] ; } @Override public void onFailure(Call call, IOException e) { failure(e); } @Override public void onResponse(Call call, Response response) throws IOException { try { String result = response.body().string(); System.out.println("result = " + result); Gson gson = new Gson(); final T t = (T) gson.fromJson(result,clazz); handler.post(new Runnable() { @Override public void run() { success(t); } }); } catch (IOException e) { e.printStackTrace(); failure(e); } catch (JsonSyntaxException e) { e.printStackTrace(); failure(e); } } }
public class OkhttpUtils { private static OkhttpUtils okhttpUtils = null ; private OkhttpUtils(){ } public static OkhttpUtils getInstance(){ if(okhttpUtils == null){ okhttpUtils = new OkhttpUtils(); client = new OkHttpClient.Builder() .readTimeout(20, TimeUnit.SECONDS) .writeTimeout(20,TimeUnit.SECONDS) .connectTimeout(20,TimeUnit.SECONDS) //.addInterceptor(new LoggingInterceptor()) .build(); } return okhttpUtils ; } private static OkHttpClient client ; public void asy(Map<String,String> params,String url,AbstractUiCallBack callBack){ Request request = null ; if(params != null){ FormBody.Builder builder = new FormBody.Builder() ; for(Map.Entry<String,String> entry : params.entrySet()){ builder.add(entry.getKey(),entry.getValue()); } FormBody body = builder.build(); request = new Request.Builder() .url(url) .post(body) .build(); } else { request = new Request.Builder() .url(url) .build(); } client.newCall(request).enqueue(callBack); } private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); public static void postFile(Map<String,String> map, String url, File file,AbstractUiCallBack callBack){ String [] array = file.getAbsolutePath().split("\\/"); MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); for(Map.Entry<String,String> entry : map.entrySet()){ builder.addFormDataPart(entry.getKey(),entry.getValue()); } builder.addFormDataPart("imageFileName",array[array.length-1]); if(file.exists() && file.length() > 0){ builder.addFormDataPart("image",array[array.length-1], RequestBody.create(MEDIA_TYPE_PNG,file)); } MultipartBody body = builder.build() ; Request request = new Request.Builder() .url(url) .post(body) .build(); client.newCall(request).enqueue(callBack); } }
2,model层
public class ClassModel { public void getData(final ModelCallBack modelCallBack){ OkhttpUtils.getInstance().asy(null, "http://120.27.23.105/product/getProducts?pscid=39&page=1", new AbstractUiCallBack<MyBean>() { @Override public void success(MyBean myBean) { modelCallBack.success(myBean); } @Override public void failure(Exception e) { modelCallBack.filture(e); } }); } public interface ModelCallBack{ public void success(MyBean myBean); public void filture(Exception e); } }
3,view层
public interface IView { public void success(MyBean myBean); public void filture(Exception e); }
4,presenter层
public class MyPresenter { ClassModel classModel; IView iView; public MyPresenter(IView iView) { this.iView = iView; this.classModel = new ClassModel(); } //获取数据 public void getDatas(){ classModel.getData(new ClassModel.ModelCallBack() { @Override public void success(MyBean myBean) { iView.success(myBean); } @Override public void filture(Exception e) { iView.filture(e); } }); } }
五,布局
1,主布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
2,子条目布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:background="#ff00ff" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/simplleview" android:layout_width="130dp" android:layout_height="130dp" fresco:placeholderImage="@drawable/ic_launcher_background"/> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
六,适配器
public class MyAdapter extends BaseAdapter { Context context; List<MyBean.DataBean> lists = new ArrayList<MyBean.DataBean>(); private GenericDraweeHierarchyBuilder builder; public MyAdapter(Context context) { this.context = context; } public void addBean(List<MyBean.DataBean> list){ // if (lists==null){ // lists = new ArrayList<>(); // } lists.addAll(list); notifyDataSetChanged(); } @Override public int getCount() { return lists.size(); } @Override public Object getItem(int position) { return lists.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView==null){ convertView = View.inflate(context, R.layout.item,null); viewHolder = new ViewHolder(); //找到控件 viewHolder.simpleDraweeView = convertView.findViewById(R.id.simplleview); viewHolder.textView = convertView.findViewById(R.id.textview); //存 convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } //设置值 String[] split = lists.get(position).getImages().split("\\|"); //ImageLoader.getInstance().displayImage(split[0],viewHolder.simpleDraweeView); Uri uri = Uri.parse(split[0]); builder = new GenericDraweeHierarchyBuilder(context.getResources()); RoundingParams params = RoundingParams.asCircle(); GenericDraweeHierarchy hierarchy = builder.setRoundingParams(params).build(); viewHolder.simpleDraweeView.setHierarchy(hierarchy); viewHolder.simpleDraweeView.setImageURI(uri); viewHolder.textView.setText(lists.get(position).getTitle()); return convertView; } class ViewHolder{ //找到控件 SimpleDraweeView simpleDraweeView; TextView textView; } }
七,初始化fresco
public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
八,记得在清单文件中配置和添加网络请求
<uses-permission android:name="android.permission.INTERNET"/> <application android:name=".app.MyApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
九,MainActivity
public class MainActivity extends AppCompatActivity implements IView{ private ListView list_view; private MyAdapter adapter; private MyPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { //requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 list_view = findViewById(R.id.list_view); adapter = new MyAdapter(this); presenter = new MyPresenter(this); list_view.setAdapter(adapter); presenter.getDatas(); } @Override public void success(MyBean myBean) { adapter.addBean(myBean.getData()); } @Override public void filture(Exception e) { } }
十,运行效果