重要的事情说三遍
加权限加权限加权限
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) {
}
});
}
}
本文详细介绍了一个基于Android平台的应用开发流程,包括网络请求封装、图片加载、MVP模式应用、RecyclerView适配器定制及二级列表展示等内容,为读者提供了一个完整的移动端应用开发案例。
1666

被折叠的 条评论
为什么被折叠?



