重要的事情说三遍
加权限加权限加权限
dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' // xrecyclerview下拉刷新上拉加载依赖包 implementation('com.jcodecraeer:xrecyclerview:1.5.9') { exclude group: 'com.android.support' } //recyclerview依赖包 implementation 'com.android.support:recyclerview-v7:28.0.0-alpha3' //okhttp网络请求依赖包 implementation 'com.squareup.okhttp3:okhttp:3.11.0' //ImageLoader请求图片依赖包 implementation files('libs/universal-image-loader-1.9.5.jar') //Gson解析依赖包 implementation 'com.google.code.gson:gson:2.2.4' }
第一步okhttp网络请求封装
public class OkhttpUtils { public static OkhttpUtils httpUtils; public static OkHttpClient client; public static Handler handler = new Handler(); public OkhttpUtils() { client= new OkHttpClient.Builder().build(); } public static OkHttpClient getclient(){ return client; } public static Handler getHandler() { return handler; } //赖汉师 public static OkhttpUtils getInstance(){ if(httpUtils==null){ synchronized (OkhttpUtils.class){ if(httpUtils==null){ httpUtils= new OkhttpUtils(); } } } return httpUtils; } //get异步网络请求 public void get(String url, Callback callback){ Request build = new Request.Builder().url(url).build(); Call call = getclient().newCall(build); call.enqueue(callback); } }
-----------------------------------------------------------------------------------------------------------------------------------------------
public abstract class OkhttpBack implements Callback{ //okhttpback public abstract void success(String json); /** * 失败 * @param json */ public abstract void failed(String json); @Override public void onFailure(Call call, final IOException e) { OkhttpUtils.getHandler().post(new Runnable() { @Override public void run() { failed(e.getMessage()); } }); } @Override public void onResponse(Call call, final Response response) throws IOException { final String string = response.body().string(); OkhttpUtils.getHandler().post(new Runnable() { @Override public void run() { success(string); } }); } }
----------------------------------------------------------------------------------------------------------------------------
ImageLoader封装
public class Myapplication extends Application { //APP @Override public void onCreate() { super.onCreate(); String file= Environment.getExternalStorageDirectory().getPath(); File file1 = new File(file); //进行框架初使化操作-全局配置 ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽 .threadPoolSize(2)//线程池的数量 .threadPriority(4) .memoryCacheSize(5*1024*1024)//设置内存缓存区大小 .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小 .diskCache(new UnlimitedDiskCache(file1))//自定义磁盘缓存目录 .writeDebugLogs()//打印日志内容 .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理 .build(); ImageLoader.getInstance().init(configuration); } public static DisplayImageOptions getoptions(){ DisplayImageOptions options=new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片 .showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时 .showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片格式 //.displayer(new RoundedBitmapDisplayer(300))//设置圆角图片 .build(); return options; } }
----------------------------------------------------------------------------------------------------------------------
MVP框架
M层
返回的接口
public interface IShowBack { //成功 void success(ShowBean showBean); //失败 void failed(String msg); }
请求网络的接口
public interface IShowTask { void getList(String url,IShowBack iShowBack); }
请求网络
public class ShowTask implements IShowTask{ @Override public void getList(String url, final IShowBack iShowBack) { OkhttpUtils.getInstance().get(url, new OkhttpBack() { @Override public void success(String json) { Gson gson = new Gson(); ShowBean bean = gson.fromJson(json, ShowBean.class); Log.i("TAG",json); iShowBack.success(bean); } @Override public void failed(String json) { iShowBack.failed("sssss"); } }); } }
V层
返回数据的接口
public interface IShowView { void getDataList(ShowBean showBean); }
P层
P层的接口
public interface IPresenter { void getData(String name,int page); }
P层调用的方法
public class Presenter implements IPresenter,IShowBack{ //M层 IShowTask iShowTask; //V层 IShowView iShowView; private String encode; public Presenter(MainActivity activity) { //实例化ishowtask iShowTask = new ShowTask(); iShowView =activity; } @Override public void success(ShowBean showBean) { iShowView.getDataList(showBean); } @Override public void failed(String msg) { } @Override public void getData(String name, int page) { try { encode = URLEncoder.encode(name, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } iShowTask.getList("http://www.zhaoapi.cn/product/searchProducts?keywords="+encode+"&"+page+"&sort=0",this); } }
--------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------
Recycler适配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.reviewholder> { private Context context; private List<ShowBean.DataBean>list; private onItemListen onItemListen; public RecyclerAdapter(Context context) { this.context = context; list= new ArrayList<>(); } public void addData(List<ShowBean.DataBean> dataBeans){ list.addAll(dataBeans); notifyDataSetChanged(); } public void cleanData(List<ShowBean.DataBean> dataBeans){ list.clear(); list.addAll(dataBeans); notifyDataSetChanged(); } @NonNull @Override public reviewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { return new reviewholder(LayoutInflater.from(context).inflate(R.layout.recyclerbase,null)); } @Override public void onBindViewHolder(@NonNull reviewholder reviewholder, int i) { reviewholder.text1.setText(list.get(i).getTitle()); ImageLoader.getInstance().displayImage((list.get(i).getImages()).split("\\|")[0],reviewholder.image, Myapplication.getoptions()); final String detailUrl = list.get(i).getDetailUrl(); final int pid = list.get(i).getPid(); reviewholder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemListen.getonItem(detailUrl,pid); } }); } @Override public int getItemCount() { return list.size(); } class reviewholder extends RecyclerView.ViewHolder{ TextView text1; ImageView image; public reviewholder(@NonNull View itemView) { super(itemView); text1= itemView.findViewById(R.id.text1); image = itemView.findViewById(R.id.image); } } public void setonItemList(RecyclerAdapter.onItemListen onItemListen) { this.onItemListen = onItemListen; } public interface onItemListen{ void getonItem(String detailUrl,int pid); } }
--------------------------------------------------------------------------------------------------------------------------
MainActivity
public class MainActivity extends AppCompatActivity implements IShowView{ private Presenter presenter; private XRecyclerView xrecycler; private RecyclerAdapter adapter; private EditText edittext; private TextView text; private int page; private String name="手机"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化presenter presenter =new Presenter(this); // presenter.getData(name,page); edittext= findViewById(R.id.edittext); getinto(); text= findViewById(R.id.text); text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { name= edittext.getText().toString(); presenter.getData(name,page); } }); } private void getinto() { //获取资源ID xrecycler= findViewById(R.id.xrecycler); xrecycler.setLoadingMoreEnabled(true); xrecycler.setPullRefreshEnabled(true); xrecycler.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { page=1; presenter.getData(name,page); xrecycler.refreshComplete(); } @Override public void onLoadMore() { page++; presenter.getData(name,page); xrecycler.loadMoreComplete(); } }); adapter = new RecyclerAdapter(this); xrecycler.setLayoutManager(new LinearLayoutManager(this)); xrecycler.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL)); xrecycler.setAdapter(adapter); } @Override public void getDataList(ShowBean showBean) { List<ShowBean.DataBean> data = showBean.getData(); Log.i("TAG",data+""); if(page==0){ adapter.cleanData(data); }else { adapter.addData(data); } adapter.setonItemList(new RecyclerAdapter.onItemListen() { @Override public void getonItem(String detailUrl,int pid) { Intent intent = new Intent(MainActivity.this, ShowActivity.class); intent.putExtra("s",detailUrl); startActivity(intent); } }); } }
----------------------------------------------------------------------------------------------------------------------
获取Webview
public class ShowActivity extends AppCompatActivity { private WebView webview; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); //获取资源ID webview =findViewById(R.id.webview); String ss = getIntent().getStringExtra("s"); webview.loadUrl(ss); button= findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(ShowActivity.this, CarActivity.class); startActivity(intent); } }); } }
--------------------------------------------------------------------------------------
创建二级列表的适配器
public class ExpandableAdapter extends BaseExpandableListAdapter { private Context context; private List<CarBean.DataBean> list; public ExpandableAdapter(Context context) { this.context = context; this.list = new ArrayList<>(); } public void addData(List<CarBean.DataBean>dataBeans){ list.addAll(dataBeans); notifyDataSetChanged(); } public void expandGrou(ExpandableListView listView){ for (int i=0;i<getGroupCount();i++){ listView.expandGroup(i); } } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int i) { return list.get(i).getList().size(); } @Override public CarBean.DataBean getGroup(int i) { return list.get(i); } @Override public CarBean.DataBean.ListBean getChild(int i, int i1) { return list.get(i).getList().get(i1); } @Override public long getGroupId(int i) { CarBean.DataBean group = getGroup(i); return group.getId(); } @Override public long getChildId(int i, int i1) { CarBean.DataBean.ListBean child = getChild(i, i1); return child.getSellerid(); } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { oneciewholder holder; if(view==null){ view= View.inflate(context,R.layout.oneexpandable,null); holder= new oneciewholder(); holder.car_text1=view.findViewById(R.id.car_text1); view.setTag(holder); }else{ holder = (oneciewholder) view.getTag(); } holder.car_text1.setText(list.get(i).getSellerName()); return view; } @Override public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { twoviewholder holder; if(view==null){ view= View.inflate(context,R.layout.twoexpandable,null); holder= new twoviewholder(); holder.car_text2= view.findViewById(R.id.car_text2); holder.car_image= view.findViewById(R.id.car_image); view.setTag(holder); }else{ holder= (twoviewholder) view.getTag(); } holder.car_text2.setText(list.get(i).getList().get(i1).getTitle()); ImageLoader.getInstance().displayImage((list.get(i).getList().get(i1).getImages()).split("\\|")[0],holder.car_image, Myapplication.getoptions()); return view; } @Override public boolean isChildSelectable(int i, int i1) { return false; } class oneciewholder{ TextView car_text1; } class twoviewholder{ TextView car_text2; ImageView car_image; }
------------------------------------------------------------------------------------------------
展示二级列表
public class CarActivity extends AppCompatActivity { private ExpandableListView expandable; private List<CarBean.DataBean> data; ExpandableAdapter expandableAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_car); //获取资源ID expandable= findViewById(R.id.expandable); getData(); } private void getData() { OkhttpUtils.getInstance().get("https://www.zhaoapi.cn/product/getCarts?uid=4243&token=94A2C256471982A75C170CAB844FE4FE", new OkhttpBack() { @Override public void success(String json) { Log.i("TAG",json); Gson gson = new Gson(); CarBean carBean = gson.fromJson(json, CarBean.class); data = carBean.getData(); expandableAdapter = new ExpandableAdapter(CarActivity.this); expandable.setAdapter(expandableAdapter); expandableAdapter.addData(data); expandableAdapter.expandGrou(expandable); } @Override public void failed(String json) { } }); } }