加依赖
//加载 图片用的包 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' //Gson implementation 'com.google.code.gson:gson:2.6.2' // OkHttp implementation 'com.squareup.okhttp3:okhttp:3.9.0' //拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'// //xRecyclerView的依赖 compile 'com.jcodecraeer:xrecyclerview:1.5.9' //recyclerView的依赖 compile 'com.android.support:recyclerview-v7:26+' //省去findViewbyid implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
添加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
android:name=".app.MyApp"
写baseFragment
public abstract class BaseFragment <P extends BaseFragmentPresenter> extends Fragment { protected P presenter; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(privideLayoutId(),container,false); presenter=providePresenter(); initViews(view); initListener(); return view; } protected abstract void initViews(View view); @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //提供presenter if (presenter==null){ presenter=providePresenter(); initData(); } } //懒加载模式 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ if (presenter==null){ return; } initData(); }else{ noVisible(); } } protected void noVisible(){}; protected abstract void initData(); protected abstract void initListener(); protected abstract P providePresenter(); protected abstract int privideLayoutId(); //解决内存泄漏 @Override public void onDestroy() { super.onDestroy(); presenter.onDestroy(); } }
IView
public interface IView { Context context(); }
BaseFragmentPresenter
public abstract class BaseFragmentPresenter<V extends IView>{ protected V view; public BaseFragmentPresenter(V view) { this.view = view; initmodel(); } protected abstract void initmodel(); void onDestroy(){ view=null; } // protected Context getContext(){ // if(view!=null && view.context()!=null){ // return view.context(); // }else{ // return MyApp.getAppContext(); // } // } }
然后写布局
主布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="40dp"> <Button android:id="@+id/btn_xin" android:background="@drawable/sao_hei" android:layout_width="35dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_gravity="center_vertical" android:layout_height="35dp" /> <EditText android:id="@+id/shuru" android:layout_width="wrap_content" android:layout_height="48dp" android:layout_centerVertical="true" android:focusable="false" android:layout_weight="1" android:text="七夕京东购物狂欢节" /> <Button android:id="@+id/btn_sao" android:background="@drawable/msg_hei" android:layout_width="35dp" android:layout_height="35dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="match_parent"> <ListView android:id="@+id/lv_class" android:layout_width="120dp" android:layout_height="match_parent"></ListView> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:orientation="vertical" android:layout_weight="1" > <ImageView android:layout_width="match_parent" android:layout_height="108dp" android:background="@drawable/timg" /> <FrameLayout android:id="@+id/fm_right_fragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" ></FrameLayout> </LinearLayout> </LinearLayout> </LinearLayout>
子布局
grid_view_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="#fff" android:layout_margin="5dp" android:orientation="vertical"> <ImageView android:id="@+id/img_grid_view_classify" android:layout_width="75dp" android:layout_height="75dp" android:layout_margin="10dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv_grid_item_classify" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:text="标题" android:gravity="center" android:textColor="#000" android:ellipsize="end" android:maxLines="3" /> </LinearLayout>
group_view_alyuot
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_name_group_class" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24dp" android:gravity="center" android:textColor="#000" android:layout_marginTop="10dp" /> </LinearLayout>
fragment_class_right
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ExpandableListView android:id="@+id/elv_right_class" android:layout_width="match_parent" android:layout_height="match_parent"></ExpandableListView> </LinearLayout>
class_list_view_item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_catagory_class" android:layout_width="match_parent" android:text="标题" android:textSize="20dp" android:padding="10dp" android:gravity="center" android:layout_height="wrap_content" /> </LinearLayout>
classmodel
public class ClassModel { public void getleftListData(final IClassifyModelCallback iClassifyModelCallback){ OkHttpUtils okHttpUtils = OkHttpUtils.getoKhttpUtils(); okHttpUtils.doGet(HttpConfig.CATAGORY_URL, new OkHttpUtils.IOKhttpUtilsCallback() { @Override public void onFailure(String error) { if(iClassifyModelCallback!=null){ iClassifyModelCallback.getLeftListFaild(error); } } @Override public void onResponse(String json) { CatagoryBean catagoryBean = new Gson().fromJson(json, CatagoryBean.class); String code = catagoryBean.getCode(); String msg = catagoryBean.getMsg(); if("0".equals(code)){ if(iClassifyModelCallback!=null){ iClassifyModelCallback.getLeftListSuccess(catagoryBean); } }else{ if(iClassifyModelCallback!=null){ iClassifyModelCallback.getLeftListFaild(msg); } } } }); } public interface IClassifyModelCallback{ void getLeftListSuccess(CatagoryBean catagoryBean); void getLeftListFaild(String error); } //获取右边子分类的数据 public void getRightListData(Integer cid, final IClassifyModelCallback2 iClassifyModelCallback2){ OkHttpUtils okHttpUtils = OkHttpUtils.getoKhttpUtils(); okHttpUtils.doGet(HttpConfig.PRODUCTCATAGORY_URL + "?cid=" + cid, new OkHttpUtils.IOKhttpUtilsCallback() { @Override public void onFailure(String error) { if(iClassifyModelCallback2!=null){ iClassifyModelCallback2.getRightListFaild(error); } } @Override public void onResponse(String json) { ProductCatagoryBean productCatagoryBean = new Gson().fromJson(json, ProductCatagoryBean.class); String code = productCatagoryBean.getCode(); String msg = productCatagoryBean.getMsg(); if("0".equals(code)){ if(iClassifyModelCallback2!=null){ iClassifyModelCallback2.getRightListSuccess(productCatagoryBean); } }else{ if(iClassifyModelCallback2!=null){ iClassifyModelCallback2.getRightListFaild(msg); } } } }); } public interface IClassifyModelCallback2{ void getRightListSuccess(ProductCatagoryBean productCatagoryBean); void getRightListFaild(String error); } }
ClassPresenter
public class ClassPresenter extends BaseFragmentPresenter<ClassView> { private ClassModel classModel; public ClassPresenter(ClassView view) { super(view); } @Override protected void initmodel() { classModel=new ClassModel(); } public void getLeftListData(){ classModel.getleftListData(new ClassModel.IClassifyModelCallback() { @Override public void getLeftListSuccess(CatagoryBean catagoryBean) { if(view!=null){ view.getLeftListSuccess(catagoryBean); } } @Override public void getLeftListFaild(String error) { if(view!=null){ view.getLeftListFaild(error); } } }); } public void getRightListData(int cid){ classModel.getRightListData(cid, new ClassModel.IClassifyModelCallback2() { @Override public void getRightListSuccess(ProductCatagoryBean productCatagoryBean) { if(view!=null){ view.getRightListSuccess(productCatagoryBean); } } @Override public void getRightListFaild(String error) { if(view!=null){ view.getRightListFaild(error); } } }); } }
MyGridView
public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
ClassRightFragment
public class ClassRightFragment extends BaseFragment<ClassPresenter> implements ClassView { private List<String> groupName=new ArrayList<>(); private List<List<String>> childNames=new ArrayList<>(); private List<List<String>> childIcons=new ArrayList<>(); private ExpandableListView expandableListView; @Override public Context context() { return getContext(); } @Override public void getLeftListSuccess(CatagoryBean catagoryBean) { } @Override public void getLeftListFaild(String error) { } public void getData(int cid){ Bundle args = new Bundle(); args.putInt("cid", cid); setArguments(args); } @Override public void getRightListSuccess(ProductCatagoryBean productCatagoryBean) { List<ProductCatagoryBean.DataBean> data = productCatagoryBean.getData(); for(int i=0;i<data.size();i++){ String name = data.get(i).getName(); groupName.add(name); List<ProductCatagoryBean.DataBean.ListBean> list = data.get(i).getList(); ArrayList<String> list_names = new ArrayList<>(); ArrayList<String> list_isons = new ArrayList<>(); for(int j=0;j<list.size();j++){ list_names.add(list.get(j).getName()); list_isons.add(list.get(j).getIcon()); } childNames.add(list_names); childIcons.add(list_isons); } MyBaseExpandableListAdapter myBaseExpandableListAdapter = new MyBaseExpandableListAdapter(getContext(), groupName, childNames, childIcons); expandableListView.setAdapter(myBaseExpandableListAdapter); //默认打开 int count = expandableListView.getCount(); for(int i=0;i<count;i++){ expandableListView.expandGroup(i); } } @Override public void getRightListFaild(String error) { } @Override protected void initViews(View view) { Bundle arguments = getArguments(); int cid = arguments.getInt("cid"); presenter.getRightListData(cid); expandableListView = view.findViewById(R.id.elv_right_class); } @Override public void initData(){ } @Override protected void initListener() { } @Override protected ClassPresenter providePresenter() { return new ClassPresenter(this); } @Override protected int privideLayoutId() { return R.layout.fragment_class_right; } }
ClassView
public interface ClassView extends IView { void getLeftListSuccess(CatagoryBean catagoryBean); void getLeftListFaild(String error); void getRightListSuccess(ProductCatagoryBean productCatagoryBean); void getRightListFaild(String error); }
MyGridViewAdapter
public class MyGridViewAdapter extends BaseAdapter { private Context context; private List<String> names; private List<String> icons; public MyGridViewAdapter(Context context, List<String> names, List<String> icons) { this.context = context; this.names = names; this.icons = icons; } @Override public int getCount() { return icons.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView= View.inflate(context, R.layout.grid_view_item,null); ImageView imageView = convertView.findViewById(R.id.img_grid_view_classify); TextView textView = convertView.findViewById(R.id.tv_grid_item_classify); holder = new ViewHolder(imageView,textView); convertView.setTag(holder); } else{ holder= (ViewHolder) convertView.getTag(); } //赋值 holder.getTextView().setText(names.get(position)); ImageLoader.getInstance().displayImage(icons.get(position),holder.getImageView(), MyApp.getOptions()); return convertView; } class ViewHolder{ private TextView textView; private ImageView imageView; public ViewHolder(ImageView imageView, TextView textView) { this.imageView = imageView; this.textView = textView; } public ImageView getImageView() { return imageView; } public void setImageView(ImageView imageView) { this.imageView = imageView; } public TextView getTextView() { return textView; } public void setTextView(TextView textView) { this.textView = textView; } } }
MyBaseExpandableListAdapter
public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> groupNames;
private List<List<String>> childNames;
private List<List<String>> childIcons;
public MyBaseExpandableListAdapter(Context context, List<String> groupNames, List<List<String>> childNames, List<List<String>> childIcons) {
this.context = context;
this.groupNames = groupNames;
this.childNames = childNames;
this.childIcons = childIcons;
}
@Override
public int getGroupCount() {
return groupNames.size();
}
@Override
public int getChildrenCount(int groupPosition) {
//加载 布局 只要一次
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
convertView=View.inflate(context,R.layout.group_view_layout,null);
TextView textView = convertView.findViewById(R.id.tv_name_group_class);
holder= new ViewHolder(textView);
convertView.setTag(holder);
}else{
holder= (ViewHolder) convertView.getTag();
}
holder.getTextView().setText(groupNames.get(groupPosition));
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
MyGridView gridView = new MyGridView(context);
MyGridViewAdapter adapter = new MyGridViewAdapter(context,childNames.get(groupPosition),childIcons.get(groupPosition));
gridView.setAdapter(adapter);
gridView.setNumColumns(3);// 设置每行列数
gridView.setGravity(Gravity.CENTER);// 位置居中
return gridView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class ViewHolder{
private TextView textView;
public ViewHolder(TextView textView) {
this.textView = textView;
}
public TextView getTextView() {
return textView;
}
public void setTextView(TextView textView) {
this.textView = textView;
}
}
}
MyLeftListAdapter
public class MyLeftListAdapter extends BaseAdapter{ private List<CatagoryBean.DataBean> list; private Context context; public MyLeftListAdapter(List<CatagoryBean.DataBean> list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView= View.inflate(context,R.layout.class_list_view_item,null); holder= new ViewHolder(); holder.textView=convertView.findViewById(R.id.tv_catagory_class); convertView.setTag(holder); }else{ holder= (ViewHolder) convertView.getTag(); } holder.textView.setText(list.get(position).getName()); return convertView; } class ViewHolder{ TextView textView; } }classFragment
public class ClassFragment extends BaseFragment<ClassPresenter> implements ClassView{ private ListView listView; private List<CatagoryBean.DataBean> list= new ArrayList<>(); @Override public void getLeftListSuccess(CatagoryBean catagoryBean) { List<CatagoryBean.DataBean> data = catagoryBean.getData(); list.addAll(data); //适配器 MyLeftListAdapter myLeftListAdapter = new MyLeftListAdapter(list, getContext()); listView.setAdapter(myLeftListAdapter); } @Override public void getLeftListFaild(String error) { } @Override public void getRightListSuccess(ProductCatagoryBean productCatagoryBean) { } @Override public void getRightListFaild(String error) { } @Override protected void initViews(View view) { listView= view.findViewById(R.id.lv_class); } @Override protected void initData() { presenter.getLeftListData(); } @Override protected void initListener() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { private ClassRightFragment classRightFragment; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { classRightFragment = new ClassRightFragment(); FragmentTransaction beginTransaction = getChildFragmentManager().beginTransaction(); beginTransaction.replace(R.id.fm_right_fragment,classRightFragment); //bundle Bundle bundle = new Bundle(); bundle.putInt("cid",list.get(position).getCid()); classRightFragment.setArguments(bundle); beginTransaction.commit(); } }); } @Override protected ClassPresenter providePresenter() { return new ClassPresenter(this); } @Override protected int privideLayoutId() { return R.layout.classs_activity; } @Override public Context context() { return null; } }