效果图
MainActivity
package com.bawei;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.widget.RadioGroup;
import com.bawei.fragments.Fragment1;
import com.bawei.fragments.Fragment2;
import com.bawei.fragments.Fragment3;
import com.hjm.bottomtabbar.BottomTabBar;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity {
private BottomTabBar mb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化组件
mb=(BottomTabBar)findViewById(R.id.bottom_tab_bar);
mb.init(getSupportFragmentManager())
.setImgSize(50,50)
.setFontSize(8)
.setTabPadding(4,6,10)
.setChangeColor(Color.RED,Color.DKGRAY)
.addTabItem("首页",R.drawable.ic_hhh, Fragment1.class)
.addTabItem("分类",R.drawable.ic_launcher_background, Fragment2.class)
.addTabItem("购物车",R.drawable.ic_hhh, Fragment3.class)
.isShowDivider(false)
.setOnTabChangeListener(new BottomTabBar.OnTabChangeListener() {
@Override
public void onTabChange(int position, String name) {
}
});
}
}
Fragments
package com.bawei.fragments;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.bawei.R;
import com.bawei.adpter.MyAdapter;
import com.bawei.bean.Data;
import com.bawei.bean.JsonBean;
import com.bawei.presenter.MainPresenter;
import com.bawei.view.MainView;
import com.google.gson.Gson;
import java.util.ArrayList;
public class Fragment1 extends Fragment implements MainView {
private RecyclerView rlv;
private RecyclerView rlv1;
private MainPresenter presenter;
private MyAdapter myAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container, false);
//找控件
rlv = view.findViewById(R.id.rlv);
rlv1 = view.findViewById(R.id.rlv1);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rlv.setLayoutManager(linearLayoutManager);
/* GridLayoutManager gridLayoutManager=new GridLayoutManager(getActivity(0));
rlv1.setLayoutManager(gridLayoutManager);
*/
//实例化p
presenter = new MainPresenter(this);
presenter.attechView(this);
presenter.onRelated();
}
@Override
public void getViewData(String json) {
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(json, JsonBean.class);
final ArrayList<Data> data = jsonBean.getData().getData();
//Log.e("tag", "getViewData: "+data);
if (data!=null){
myAdapter = new MyAdapter(getActivity(), data);
rlv.setAdapter(myAdapter);
//rlv1.setAdapter(myAdapter);
}
/**
* 点击事件
*/
myAdapter.setItemClickListener(new MyAdapter.onItemClickListener() {
@Override
public void ClickListener(View view, int position) {
Toast.makeText(getActivity(),"单击",Toast.LENGTH_SHORT).show();
}
});
myAdapter.setItemLongClickListener(new MyAdapter.onItemLongClickListener() {
@Override
public void LongClickListener(View view, int position) {
data.remove(position);
myAdapter.notifyItemRangeRemoved(position,1);
Toast.makeText(getActivity(),"删除成功",Toast.LENGTH_SHORT).show();
}
});
}
//页面销毁时调用软引用销毁
@Override
public void onDestroy() {
super.onDestroy();
presenter.deatchView();
}
}
package com.bawei.fragments;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.bawei.R;
public class Fragment2 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, container, false);
return view;
}
}
package com.bawei.fragments;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.bawei.R;
public class Fragment3 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment3, container, false);
return view;
}
}
adpter
package com.bawei.adpter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bawei.R;
import com.bawei.bean.Data;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private ArrayList<Data> data;
private static final int TYPE_ONE = 0;
private static final int TYPE_TW0 = 1;
public MyAdapter(Context context, ArrayList<Data> data) {
this.context = context;
this.data = data;
}
@Override
public int getItemViewType(int position) {
if (position % 4 == 0) {
return TYPE_TW0;
} else {
return TYPE_ONE;
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if (i == TYPE_ONE) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_one, null, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
} else {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_two, null, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
int itemViewType = getItemViewType(i);
//配置imageloader
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.mipmap.ic_launcher)
.cacheOnDisk(true)
.build();
Data data = this.data.get(i);
if (itemViewType == TYPE_ONE) {
if (data != null) {
myViewHolder.title1.setText(this.data.get(i).getTitle());
ImageLoader.getInstance().displayImage("http://365jia.cn/uploads/" + this.data.get(i).getPics().get(0), myViewHolder.img1, options);
}
} else {
if (data != null) {
myViewHolder.title2.setText(this.data.get(i).getTitle());
ImageLoader.getInstance().displayImage("http://365jia.cn/uploads/" + this.data.get(i).getPics().get(0), myViewHolder.img2, options);
}
}
//单击
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = myViewHolder.getLayoutPosition();
View view = myViewHolder.itemView;
if (itemClickListener != null) {
itemClickListener.ClickListener(view, position);
}
}
});
//长按
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = myViewHolder.getLayoutPosition();
View view = myViewHolder.itemView;
if (itemLongClickListener != null) {
itemLongClickListener.LongClickListener(view, position);
}
return true;
}
});
}
@Override
public int getItemCount() {
return data.size();
}
//自定义
public class MyViewHolder extends RecyclerView.ViewHolder {
private final ImageView img1;
private final ImageView img2;
private final TextView title1;
private final TextView title2;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
img1 = itemView.findViewById(R.id.img1);
img2 = itemView.findViewById(R.id.img2);
title1 = itemView.findViewById(R.id.title1);
title2 = itemView.findViewById(R.id.title2);
}
}
/**
* 接口回调
*/
public interface onItemClickListener {
void ClickListener(View view, int position);
}
public interface onItemLongClickListener {
void LongClickListener(View view, int position);
}
public onItemClickListener itemClickListener;
public onItemLongClickListener itemLongClickListener;
public void setItemClickListener(onItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
public void setItemLongClickListener(onItemLongClickListener itemLongClickListener) {
this.itemLongClickListener = itemLongClickListener;
}
}
app
package com.bawei.app;
import android.app.Application;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
File file = StorageUtils.getCacheDirectory(this);
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.diskCache(new UnlimitedDiskCache(file))
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(50)
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.build();
ImageLoader.getInstance().init(configuration);
}
}
bean
package com.bawei.bean;
import java.util.ArrayList;
/**
* @Auther: Mac
* @Date: 2019/2/18 09:19:16
* @Description:
*/
public class Data {
private String title;
private ArrayList<String> pics;
public Data(String title, ArrayList<String> pics) {
this.title = title;
this.pics = pics;
}
public Data() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ArrayList<String> getPics() {
return pics;
}
public void setPics(ArrayList<String> pics) {
this.pics = pics;
}
@Override
public String toString() {
return "Data{" +
"title='" + title + '\'' +
", pics=" + pics +
'}';
}
}
package com.bawei.bean;
import java.util.ArrayList;
/**
* @Auther: Mac
* @Date: 2019/2/18 09:47:37
* @Description:
*/
public class Extras {
ArrayList<Slider> slider;
public Extras(ArrayList<Slider> slider) {
this.slider = slider;
}
@Override
public String toString() {
return "Extras{" +
"slider=" + slider +
'}';
}
public ArrayList<Slider> getSlider() {
return slider;
}
public void setSlider(ArrayList<Slider> slider) {
this.slider = slider;
}
public class Slider{
private String id;
private String inner_news;
private String link;
private String pic;
private String t;
private String title;
private String type;
private String type_sign;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getInner_news() {
return inner_news;
}
public void setInner_news(String inner_news) {
this.inner_news = inner_news;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getType_sign() {
return type_sign;
}
public void setType_sign(String type_sign) {
this.type_sign = type_sign;
}
public Slider(String id, String inner_news, String link, String pic, String t, String title, String type, String type_sign) {
this.id = id;
this.inner_news = inner_news;
this.link = link;
this.pic = pic;
this.t = t;
this.title = title;
this.type = type;
this.type_sign = type_sign;
}
}
}
package com.bawei.bean;
import java.util.ArrayList;
/**
* @Auther: Mac
* @Date: 2019/2/18 09:23:04
* @Description:
*/
public class JsonBean {
private String code;
private Data1 data;
private int httpStatusCode;
@Override
public String toString() {
return "JsonBean{" +
"code='" + code + '\'' +
", data=" + data +
", httpStatusCode=" + httpStatusCode +
'}';
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Data1 getData() {
return data;
}
public void setData(Data1 data) {
this.data = data;
}
public int getHttpStatusCode() {
return httpStatusCode;
}
public void setHttpStatusCode(int httpStatusCode) {
this.httpStatusCode = httpStatusCode;
}
public JsonBean(String code, Data1 data, int httpStatusCode) {
this.code = code;
this.data = data;
this.httpStatusCode = httpStatusCode;
}
public class Data1 {
private String bindtips;
private ArrayList<Data> data;
private Extras extras;
private int max_page;
private int page;
private int perpage;
private int total;
@Override
public String toString() {
return "Data1{" +
"bindtips='" + bindtips + '\'' +
", data=" + data +
", extras=" + extras +
", max_page=" + max_page +
", page=" + page +
", perpage=" + perpage +
", total=" + total +
'}';
}
public String getBindtips() {
return bindtips;
}
public void setBindtips(String bindtips) {
this.bindtips = bindtips;
}
public ArrayList<Data> getData() {
return data;
}
public void setData(ArrayList<Data> data) {
this.data = data;
}
public Extras getExtras() {
return extras;
}
public void setExtras(Extras extras) {
this.extras = extras;
}
public int getMax_page() {
return max_page;
}
public void setMax_page(int max_page) {
this.max_page = max_page;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPerpage() {
return perpage;
}
public void setPerpage(int perpage) {
this.perpage = perpage;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public Data1(String bindtips, ArrayList<Data> data, Extras extras, int max_page, int page, int perpage, int total) {
this.bindtips = bindtips;
this.data = data;
this.extras = extras;
this.max_page = max_page;
this.page = page;
this.perpage = perpage;
this.total = total;
}
}
}
model
package com.bawei.model;
import android.os.Handler;
import android.os.Message;
import com.bawei.util.OkHttpUtils;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MainModel {
String url = "http://365jia.cn/news/api3/365jia/news/headline?page=1";
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
String json = (String) msg.obj;
mainListener.onResult(json);
}
}
};
public void getHttpData() {
OkHttpUtils.getInstance().doGet(url, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
//发送消息
Message message = new Message();
message.what = 0;
message.obj = json;
handler.sendMessage(message);
}
});
}
/**
* 接口回调
*/
public interface onMainListener {
void onResult(String json);
}
public onMainListener mainListener;
public void setOnMainListener(onMainListener onMainListener) {
this.mainListener = onMainListener;
}
}
presenter
package com.bawei.presenter;
import com.bawei.model.MainModel;
import com.bawei.view.MainView;
import java.lang.ref.WeakReference;
public class MainPresenter<T> {
private final MainModel mainModel;
private final MainView mainView;
private WeakReference<T> tWeakReference = null;
public MainPresenter(MainView view) {
mainModel = new MainModel();
mainView = view;
}
public void onRelated() {
mainModel.getHttpData();
//调用m接口关联view
mainModel.setOnMainListener(new MainModel.onMainListener() {
@Override
public void onResult(String json) {
mainView.getViewData(json);
}
});
}
//通过软引用控制外部类对象
public void attechView(T t) {
tWeakReference = new WeakReference<T>(t);
}
//清空软引用
public void deatchView() {
if (tWeakReference != null) {
tWeakReference.clear();
tWeakReference = null;
}
}
}
util
package com.bawei.util;
import android.util.Log;
import okhttp3.Callback;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpUtils {
/**
* 单例模式
*/
private static OkHttpUtils okHttpUtils = null;
private OkHttpUtils() {
}
public static OkHttpUtils getInstance() {
//双层判断
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
okHttpUtils = new OkHttpUtils();
}
}
return okHttpUtils;
}
/**
* 拦截器
*/
private Interceptor getInterceptor() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("tag", "log:拦截器 " + message);
}
});
return interceptor;
}
/**
* doGet方法
*/
public void doGet(String url, Callback callback) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(getInterceptor())
.build();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
}
view
package com.bawei.util;
import android.util.Log;
import okhttp3.Callback;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpUtils {
/**
* 单例模式
*/
private static OkHttpUtils okHttpUtils = null;
private OkHttpUtils() {
}
public static OkHttpUtils getInstance() {
//双层判断
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
okHttpUtils = new OkHttpUtils();
}
}
return okHttpUtils;
}
/**
* 拦截器
*/
private Interceptor getInterceptor() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("tag", "log:拦截器 " + message);
}
});
return interceptor;
}
/**
* doGet方法
*/
public void doGet(String url, Callback callback) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(getInterceptor())
.build();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
}
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.hjm.bottomtabbar.BottomTabBar
android:id="@+id/bottom_tab_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</com.hjm.bottomtabbar.BottomTabBar>
</android.support.constraint.ConstraintLayout>
<?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:background="#00f">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1">
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxHeight="10dp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3">
<android.support.v7.widget.RecyclerView
android:id="@+id/rlv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxHeight="10dp" />
</LinearLayout>
</LinearLayout>
<?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:background="#0ff">
</LinearLayout>
<?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:background="#0f0">
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e1e0de">
<ImageView
android:id="@+id/img1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
android:layout_margin="10dp"
android:src="@mipmap/ic_launcher_round" />
<TextView
android:id="@+id/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/img1"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:layout_toLeftOf="@id/img1"
android:text="哈哈"
android:textSize="15sp" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈"
android:layout_margin="10dp"
android:textSize="15sp" />
<ImageView
android:id="@+id/img2"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_below="@id/title2"
android:layout_margin="10dp"
android:src="@mipmap/ic_launcher_round" />
</RelativeLayout>
依赖
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.squareup.okhttp3:okhttp:3.2.0'
implementation 'com.squareup.okio:okio:1.7.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
implementation 'com.android.support:recyclerview-v7:28.+'
implementation 'com.google.code.gson:gson:2.8.5'
compile 'com.hjm:BottomTabBar:1.1.1'