第一个页面设置引导页动画
在动画结束后跳转到列表页面
public class MainActivity extends AppCompatActivity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = findViewById(R.id.IV);
getSupportActionBar().hide();
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int height = displayMetrics.heightPixels;
//缩放
ObjectAnimator objectAnimator1=ObjectAnimator.ofFloat(iv,"scaleX",2,1);
//渐变
ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(iv,"alpha",0,1);
//旋转
ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(iv,"rotation",0,360);
//平移
ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(iv,"translationY",0,height/2-iv.getHeight()/2);
AnimatorSet set=new AnimatorSet();
//组合
set.play(objectAnimator1).with(objectAnimator2).with(objectAnimator3).with(objectAnimator4);
//设置时间
set.setDuration(3000);
//动画开启
set.start();
//动画执行过程
set.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
startActivity(new Intent(MainActivity.this,TwoActivity.class));
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
}
写两个页面(用fragment)点击底部切换
public class TwoActivity extends AppCompatActivity {
private FrameLayout framelayout;
private RadioGroup rg;
private FragmentManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
framelayout = findViewById(R.id.framelayout);
rg = findViewById(R.id.rg);
initData();
}
private void initData() {
manager = getSupportFragmentManager();
final OneFragment fragment1=new OneFragment();
final TwoFragmennt fragmennt2=new TwoFragmennt();
manager.beginTransaction().replace(R.id.framelayout,fragment1).commit();
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentTransaction transaction=manager.beginTransaction();
switch (checkedId){
case R.id.button1:
transaction.replace(R.id.framelayout,fragment1);
break;
case R.id.button2:
transaction.replace(R.id.framelayout,fragmennt2);
break;
}
transaction.commit();
}
});
}
}
列表顶部要实现自定义view
public class SearchView extends LinearLayout {
private int searchColor;
private ImageView back;
private ImageView btn_ss;
private EditText edit_ss;
public SearchView(Context context) {
this(context,null);
}
public SearchView(Context context,AttributeSet attrs) {
this(context, attrs,0);
}
public SearchView(Context context,AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
initAttrs(context,attrs);
initView();
}
private void initView() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.hander, this, true);
back = view.findViewById(R.id.back);
btn_ss = view.findViewById(R.id.btn_ss);
edit_ss = view.findViewById(R.id.edit_ss);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (searchViewCallback!=null){
searchViewCallback.onClickListener(v);
}
}
});
btn_ss.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(edit_ss.getText().toString())){
if (searchViewCallback!=null)
searchViewCallback.keywordsEmpty();
return;
}
if (searchViewCallback!=null)
searchViewCallback.searchClick(edit_ss.getText().toString());
}
});
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SearchView);
searchColor = typedArray.getColor(R.styleable.SearchView_searchColor, Color.BLUE);
if (typedArray!=null){
typedArray.recycle();
}
}
private SearchViewCallback searchViewCallback;
/**
* 调用者去调用
* @param searchViewCallback
*/
public void setSearchViewCallback(SearchViewCallback searchViewCallback) {
this.searchViewCallback = searchViewCallback;
}
public interface SearchViewCallback{
void keywordsEmpty();
void onClickListener(View v);//点击事件
void searchClick(String keywords);//搜索点击事件
}
}
布局如下
<LinearLayout
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/back"
android:src="@drawable/b"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:src="@drawable/aaa"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/btn_ss"
android:src="@drawable/c"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:layout_weight="1"
android:layout_gravity="center"
android:id="@+id/edit_ss"
android:drawableRight="@drawable/e"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
要在value文件下新建attrs.xml文件
<declare-styleable name="SearchView">
<attr name="searchColor" format="color"/>
<attr name="searchSize" format="dimension"/>
</declare-styleable>
在fragment实现自定义view
public class OneFragment extends Fragment implements SearchView.SearchViewCallback {
private SearchView search;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag01, null);
search = view.findViewById(R.id.search);
search.setSearchViewCallback(this);
return view;
}
@Override
public void keywordsEmpty() {
Toast.makeText(getActivity(),"关键词不能为空",Toast.LENGTH_SHORT).show();
}
@Override
public void onClickListener(View v) {
getActivity().finish();
}
@Override
public void searchClick(String keywords) {
String result = keywords;
}
}
mvp框架
写锲约类
public interface ListContract {
interface IModel{
void getLeftList(HashMap<String,String> params, ListModel.ModelCallback modelCallback);
void getRightList(HashMap<String,String> params, ListModel.ModelCallback modelCallback);
}
interface IView{
void leftSucess(List<Leftbean.databean> leftbean);
void rightSucess(List<Rightbean.databean> rightbean);
void leftFailure(String error);
void rightFailure(String error);
}
abstract class IPresenter{
public abstract void getLeftList(HashMap<String,String> params);
public abstract void getRightList(HashMap<String,String> params);
}
}
model层
public class ListModel implements ListContract.IModel {
@Override
public void getLeftList(HashMap<String, String> params, final ModelCallback modelCallback) {
OkhttpUtils.getInstance().doPost(UserApi.left_api, params, new OkhttpCallback() {
@Override
public void failure(String msg) {
modelCallback.leftFailure(msg);
}
@Override
public void success(String result) {
modelCallback.leftSuccess(result);
}
});
}
@Override
public void getRightList(HashMap<String, String> params, final ModelCallback modelCallback) {
OkhttpUtils.getInstance().doPost(UserApi.right_api, params, new OkhttpCallback() {
@Override
public void failure(String msg) {
modelCallback.rightFailure(msg);
}
@Override
public void success(String result) {
modelCallback.rightSUccess(result);
}
});
}
public interface ModelCallback{
void leftSuccess(String result);
void rightSUccess(String result);
void leftFailure(String error);
void rightFailure(String error);
}
}
presenter层
public class ListPresenter extends ListContract.IPresenter {
private ListModel listModel;
private ListContract.IView iView;
public ListPresenter(ListContract.IView iView) {
listModel=new ListModel();
this.iView = iView;
}
@Override
public void getLeftList(HashMap<String, String> params) {
listModel.getLeftList(params, new ListModel.ModelCallback() {
@Override
public void leftSuccess(String result) {
Leftbean leftbean = new Gson().fromJson(result, Leftbean.class);
List<Leftbean.databean> data = leftbean.data;
iView.leftSucess(data);
}
@Override
public void rightSUccess(String result) {
}
@Override
public void leftFailure(String error) {
}
@Override
public void rightFailure(String error) {
}
});
}
@Override
public void getRightList(HashMap<String, String> params) {
listModel.getRightList(params, new ListModel.ModelCallback() {
@Override
public void leftSuccess(String result) {
}
@Override
public void rightSUccess(String result) {
Rightbean json = new Gson().fromJson(result, Rightbean.class);
List<Rightbean.databean> data = json.data;
iView.rightSucess(data);
}
@Override
public void leftFailure(String error) {
}
@Override
public void rightFailure(String error) {
}
});
}
}
工具类
ok的callback
public interface OkhttpCallback {
void failure(String msg);//服务器请求失败:断网,服务器宕机等等因素
void success(String result);//数据合法
}
工具类
public class OkhttpUtils {
private Handler handler = new Handler() ;
private OkHttpClient okHttpClient;
private static OkhttpUtils mInstance;//私有属性
private OkhttpUtils() {//私有构造方法
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)//添加日志拦截器
.writeTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();//链式调用,构建者模式
}
/**
* 创建实例,双重检验锁,单例模式进行实例化
*
* @return
*/
public static OkhttpUtils getInstance() {
if (mInstance == null) {
synchronized (OkhttpUtils.class) {
if (mInstance == null) {
mInstance = new OkhttpUtils();
}
}
}
return mInstance;
}
/**
* get请求方式
*/
public void doGet(String url,HashMap<String, String> parmas, final OkhttpCallback requestCallback) {
StringBuilder p = new StringBuilder();
if (parmas!=null&&parmas.size()>0){
for (Map.Entry<String, String> map : parmas.entrySet()) {
p.append(map.getKey()).append("=").append(map.getValue()).append("&");
}
System.out.println("ppppppp===="+p.toString());
}
Request request = new Request.Builder().url(url+"?"+p.toString())
.get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (requestCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
requestCallback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String result = response.body().string();
if (requestCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
requestCallback.success(result);
}
});
}
}
});
}
/**
* Post请求方式
*/
public void doPost(String url, HashMap<String, String> parmas, final OkhttpCallback callback) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> map : parmas.entrySet()) {
builder.add(map.getKey(), map.getValue());
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder().url(url)
.post(requestBody).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (callback != null) {
handler.post(new Runnable() {
@Override
public void run() {
callback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (callback != null) {
if (200 == response.code()) {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
callback.success(result);
}
});
}
}
}
});
}
/**
* 上传头像,文件
*/
public void uploadFile(String url, HashMap<String, Object> params, final OkhttpCallback okhttpCallback) {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
for (Map.Entry<String, Object> map : params.entrySet()) {
String key = map.getKey();
Object value = map.getValue();
if (value instanceof File) {
File file = (File) value;
builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
} else {
builder.addFormDataPart(key, value.toString());
}
}
Request request = new Request.Builder().url(url).post(builder.build()).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (okhttpCallback != null) {
handler.post(new Runnable() {
@Override
public void run() {
okhttpCallback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (okhttpCallback != null) {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
okhttpCallback.success(result);
}
});
}
}
});
}
/**
* 取消所有请求,好处:节省开销:内存开销,cpu的开销(线程开销)
*/
public void cancelAllTask() {
if (okHttpClient != null) {
okHttpClient.dispatcher().cancelAll();
}
}
}
三个RecycleView的适配器
第一个
public class Adapter_one extends RecyclerView.Adapter<Adapter_one.ViewHolder> {
private Context context;
private List<Leftbean.databean> list;
public Adapter_one(Context context, List<Leftbean.databean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public Adapter_one.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item1, viewGroup, false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final Adapter_one.ViewHolder viewHolder, int i) {
final Leftbean.databean databean = list.get(i);
viewHolder.name.setText(databean.name);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = viewHolder.getLayoutPosition();
listener.onItemClickListener(viewHolder.itemView,pos);
}
});
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = viewHolder.getLayoutPosition();
listener.onItemLongClickListener(viewHolder.itemView,pos);
return false;
}
});
}
@Override
public int getItemCount() {
return list==null?0:list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView name;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
}
}
public interface OnRecycleViewClickListener{
void onItemClickListener(View view,int position);
void onItemLongClickListener(View view,int position);
}
private OnRecycleViewClickListener listener;
public void setListener(OnRecycleViewClickListener listener) {
this.listener = listener;
}
}
第二个
public class Adapter_two extends RecyclerView.Adapter<Adapter_two.ViewHolder> {
private Context context;
private List<Rightbean.databean> list;
public Adapter_two(Context context, List<Rightbean.databean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public Adapter_two.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item2, viewGroup, false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final Adapter_two.ViewHolder viewHolder, int i) {
Rightbean.databean databean = list.get(i);
final List<Rightbean.databean.userbean> list = databean.list;
viewHolder.name.setText(databean.name);
viewHolder.rv.setLayoutManager(new GridLayoutManager(context,3));
final Adapter_three adapter3=new Adapter_three(context,list);
viewHolder.rv.setAdapter(adapter3);
adapter3.setListener(new Adapter_three.OnRecycleViewClickListener() {
@Override
public void onItemClickListener(View view, int position) {
}
@Override
public void onItemLongClickListener(View view, int position) {
list.remove(position);
adapter3.notifyItemRemoved(position);
adapter3.notifyItemRangeChanged(0,adapter3.getItemCount());
}
});
}
@Override
public int getItemCount() {
return list==null?0:list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView name;
private final RecyclerView rv;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
rv = itemView.findViewById(R.id.rc_view);
}
}
}
第三个
public class Adapter_three extends RecyclerView.Adapter<Adapter_three.ViewHolder> {
private Context context;
private List<Rightbean.databean.userbean> list;
public Adapter_three(Context context, List<Rightbean.databean.userbean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public Adapter_three.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item3, viewGroup, false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final Adapter_three.ViewHolder viewHolder, int i) {
Rightbean.databean.userbean userbean = list.get(i);
viewHolder.name.setText(userbean.name);
Glide.with(context).load(userbean.icon).into(viewHolder.iv);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = viewHolder.getLayoutPosition();
listener.onItemClickListener(viewHolder.itemView,pos);
}
});
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int pos = viewHolder.getLayoutPosition();
listener.onItemLongClickListener(viewHolder.itemView,pos);
return false;
}
});
}
@Override
public int getItemCount() {
return list==null?0:list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView iv;
private final TextView name;
public ViewHolder(@NonNull View itemView) {
super(itemView);
iv = itemView.findViewById(R.id.iv);
name = itemView.findViewById(R.id.name);
}
}
public interface OnRecycleViewClickListener{
void onItemClickListener(View view,int position);
void onItemLongClickListener(View view,int position);
}
private OnRecycleViewClickListener listener;
public void setListener(OnRecycleViewClickListener listener) {
this.listener = listener;
}
}
以及适配器的布局文件
public class OneFragment extends Fragment implements ListContract.IView {
private RecyclerView rv_left,rv_right;
private String cid="1";
private List<Leftbean.databean> list;
private ListPresenter presenter;
private Adapter_one adapter1;
private Adapter_two adapter2;
private HashMap<String, String> p2;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=View.inflate(getActivity(),R.layout.frag01,null);
rv_left = view.findViewById(R.id.rv_left);
rv_right = view.findViewById(R.id.rv_right);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
}
private void initData() {
rv_left.setLayoutManager(new LinearLayoutManager(getActivity()));
rv_right.setLayoutManager(new LinearLayoutManager(getActivity()));
presenter=new ListPresenter(this);
getLeft();
presenter.getLeftList(new HashMap<String, String>());
}
private void getLeft() {
list= new ArrayList<>();
p2= new HashMap<>();
p2.put("cid",cid);
presenter.getRightList(p2);
}
@Override
public void leftSucess(List<Leftbean.databean> leftbean) {
if (adapter1==null){
adapter1= new Adapter_one(getActivity(),leftbean);
rv_left.setAdapter(adapter1);
adapter1.setListener(new Adapter_one.OnRecycleViewClickListener() {
@Override
public void onItemClickListener(View view, int position) {
getLeft();
}
@Override
public void onItemLongClickListener(View view, int position) {
}
});
}else{
adapter1.notifyDataSetChanged();
}
}
@Override
public void rightSucess(List<Rightbean.databean> rightbean) {
adapter2= new Adapter_two(getActivity(),rightbean);
rv_right.setAdapter(adapter2);
}
@Override
public void leftFailure(String error) {
}
@Override
public void rightFailure(String error) {
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}