我理解的android

70 阅读2分钟
package com.smartonet.enterprises.activity;

import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ListView;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.smartonet.R;
import com.smartonet.core.BaseActivity;
import com.smartonet.core.api.AsynchronousApi;
import com.smartonet.core.http.Cloud;
import com.smartonet.core.http.CommonResp;
import com.smartonet.enterprises.adapter.EnterpriseListAdapter;
import com.smartonet.site.bean.SiteInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import io.reactivex.functions.Consumer;

/**
 * Creat by hanzhao
 * on 2019/9/23
 **/


/**
 * todo
 * BaseActivity, activity分为很多种活动,有v7的兼容6  v4的兼容android 4  和直接activity的当前设备版本activity,由于追求稳定则使用v4中的acticity
 */
public class EnterpriseListAvtivity extends BaseActivity {
    private EditText searchView;
    private ListView enterpriseListView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private EnterpriseListAdapter adapter;
    private ListView searchEnterpriseListView;
    private EnterpriseListAdapter searchAdapter;
    private String searchStr;
    private Timer searchTimer;
    private Integer toast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        BaseActivity.flag=0;//表示程序启动
        toast=0;
        super.onCreate(savedInstanceState);
        //1.加载指定页面布局
        setContentView(R.layout.activity_enterprise_list);
        //2.获取界面控件
        getView();
        //3.加载企业列表
        initEnterprise();
        //4.搜索功能
        search();
        //5.绑定事件
        setClick();
    }

    //获取界面控件
    private void getView(){
        //todo
        //Android自动运行生成R文件,该文件中包含各种静态内部类和控件,自动编译不可手动编译,控件要么获取实例,要么要先给定id
        enterpriseListView = findViewById(R.id.lv_enterprise_list_enterprises);
        searchEnterpriseListView = findViewById(R.id.lv_enterprise_list_search_enterprises);
        swipeRefreshLayout = findViewById(R.id.srl_enterprise_list_enterprises);
        searchView = findViewById(R.id.et_enterprise_list_search);
    }

    //初始化企业列表
    private void initEnterprise(){
        //1.渲染列表
        adapter = new EnterpriseListAdapter(EnterpriseListAvtivity.this,new ArrayList<SiteInfo>());
        enterpriseListView.setAdapter(adapter);
        queryEnterprise();
        //2.上划加载
        enterpriseListView.setOnScrollListener(new ListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
            }
            @Override
            public void onScroll(AbsListView absListView, int canSeeOne, int canSeeSum, int AllCount) {
                if (canSeeOne + canSeeSum == AllCount && AllCount > 0 && toast == 0) {
                    //5.1发送请求加载下一页数据
                    queryEnterprise();//发送请求添加进入adapter中
                }
            }
        });
        //3.下拉刷新
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                toast = 1;//代表现在是下拉刷新状态
                adapter.clear();
                queryEnterprise();
            }
        });
    }

    //todo 在这里我为了防止一次性加载过多的数据,使用了toast变量,防止网络有问题加载重复的问题
    //异步查询企业
    private void queryEnterprise(){
        Map<String,String> params = new HashMap<>();
        params.put("length","20");
        params.put("start", String.valueOf(adapter==null? 0:adapter.getCount()));
        AsynchronousApi.httpPost(this, Cloud.getAPI_SITELIST(), new Consumer<CommonResp>() {
            @Override
            public void accept(CommonResp o) throws Exception {
                List<SiteInfo> site = JSON.parseObject(o.getData().toString(), new TypeReference<List<SiteInfo>>(){});
                if(toast==1){//下拉刷新关闭刷新动画
                    swipeRefreshLayout.setRefreshing(false);
                }
                //更新显示数据
                if(site.size()>0) {
                    adapter.addAll(site);
                }
                if(site.size()<20){
                    toast=2;
                }
            }
        });
    }

    //todo 点击事件两种方式实现onclick,要么直接setOnclick匿名内部类,要么使当前类集成click事件
    //设置点击事件
    private void setClick(){
        findViewById(R.id.lay_enterprise_list_back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    //todo 在这里使用的方式为两个列表 搜索时显示搜索列表、清空输入框显示原来的列表
    //因为采用异步加载,一旦搜索结束将界面还原为原来的样子会很麻烦
    //设置搜索事件
    private void search(){
        searchView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                //1.判断输入是否完成
                searchStr = searchView.getText().toString();
                if(searchTimer!=null){
                    return;
                }
                //2.判断是否清空了输入框
                if(searchStr.equals("")){
                    searchTimer=null;
                    searchEnterpriseListView.setVisibility(View.GONE);
                    swipeRefreshLayout.setVisibility(View.VISIBLE);
                    return;
                }else{
                    searchEnterpriseListView.setVisibility(View.VISIBLE);
                    swipeRefreshLayout.setVisibility(View.GONE);
                }
                searchTimer = new Timer();
                searchTimer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        while(true){
                            if(searchStr.equals(searchView.getText().toString())){
                                //发送消息查询
                                Map<String,String> params = new HashMap<>();
                                params.put("enterprise",searchStr);
                                AsynchronousApi.httpPost(EnterpriseListAvtivity.this, Cloud.getAPI_MAP(),params, new Consumer<CommonResp>() {
                                    @Override
                                    public void accept(CommonResp o) throws Exception {
                                        List<SiteInfo> site = JSON.parseObject(o.getData().toString(), new TypeReference<List<SiteInfo>>(){});
                                        searchAdapter = new EnterpriseListAdapter(EnterpriseListAvtivity.this,site);
                                        searchEnterpriseListView.setAdapter(searchAdapter);
                                    }
                                });
                                searchTimer=null;
                                break;
                            }
                        }
                    }
                },1500);//延时1.5s执行
            }
        });
    }
}

//todo 四大组件 活动、服务、广播、共享数据


/**
 * 广播  分为两种,静态广播(需要在application中注册),app内部动态广播  动态广播类似于消息服务的主题订阅,存活在contenxt中
 * 静态广播则是app唤醒,监听系统开关机、锁屏等系统广播
 */

/**
 * activity 活动前台界面,属于当前显示层,系统会尽可能地优先给与最大的资源支持(根据不同rom分配的资源,和申请的资源)
 */

/**
 * service 后台活动和activity一样,只是没有界面显示,他可绑定到activity中也可独立运行优先级比activity 低一等,部分厂商如果没有进入白名单 app未在前台会被系统杀掉
 */

在这里插入图片描述

我是从java转过来的刚写1年左右android,如果理解错误可以对我指正,万分感谢!