項目中ListView使用分析

1 我不喜歡用implements 的方式來寫代碼
2 各種方式的區別總結
3 看LoadMoreListView源碼
public class HomeSubjectListUI extends BaseFragmentActivity implements AdapterView.OnItemClickListener, NetRequestUtils.RequestListener, LoadMoreListView.RefreshListener, SwipeRefreshLayout.OnRefreshListener {
    //加載更多數據lv
    private LoadMoreListView praoseLv = null;
    // 刷新控件
    private SwipeRefreshLayout swipeLayout;
    //是否正在加載數據標記,正在加載就是true,反之false,如果正在加載就不再調用接口
    //1 初始值false; 2 開始加載數據前判斷,false才調用,並改變其狀態true;3 在數據回調中改爲false
    private boolean isLoadingData = false;
    //adapter
    private HomeSubjectListAdapter adapter;
    //data
    private List<SubjectVo> source;
    //當前頁,初始值1(根據後臺接口會有不同),加載一頁成功之後+1;
    private int currentPage = 1;
    //正在加載的頁面,如果成功加載完畢,就將其賦值給crrentPage,加載失敗就什麼都不做,感覺有點多餘
    //其實就在成功回調中將currentPage++就可以了啊,刷新頁面再將currentPage==1;
    private int oldPage = 1;
    //沒有數據的提示
    private TextView  empty_view;
    @Override
    protected void setContentView() {
        setContentView(R.layout.praise_list_layout);
    }

    @Override
    protected void findViewById() {
        praoseLv = (LoadMoreListView) findViewById(R.id.refreshListView);
        swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
        empty_view = (TextView) findViewById(R.id.empty_view);
    }

    @Override
    protected void setListener() {
        //?
        praoseLv.setOnScrollListener(new              PauseOnScrollListener(NextApplication.mImageLoader, true, true));
        //加載更多的監聽
        praoseLv.setOnRefreshListener(this);
        //下拉刷新
        swipeLayout.setOnRefreshListener(this);
    }

    @Override
    protected void initData() {
        swipeLayout.setColorSchemeResources(R.color.app_title_bg);
        empty_view.setVisibility(View.GONE);
        //提前new ArrayaList
        source = new ArrayList<SubjectVo>();
        //提前new Adapter
        adapter = new HomeSubjectListAdapter(this, source);
        //提前setAdapter,這三步有時候我是在加載完數據之後做的
        praoseLv.setAdapter(adapter);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeLayout.setRefreshing(true);
                loadData(1);
            }
        }, 500);
        mRequestUtils = NetRequestUtils.getInstance();

    }

    private void loadData(int page) {
        if (isLoadingData) {
            return;
        }
        isLoadingData = true;
        oldPage = page;
        Map<String, String> params = new HashMap<String, String>();
        params.put("page", page + "");
        params.put("type", type + "");
        params.put("classid","0");
        JSONObject jsonRequest = mRequestUtils.getJsonRequest("home", "class_get_video", params);
        mRequestUtils.requestJsonObject(jsonRequest, this);


    }
    @Override
    public void onRefresh() {
        loadData(1);
    }

    @Override
    public void loadMore() {
        loadData(currentPage + 1);
    }

    @Override
    public void start() {

    }

    @Override
    public void success(JSONObject response) {
        currentPage = oldPage;
        if (currentPage == 1) {
            source.clear();
        }
        //這裏用的是原生的解析方式
        JSONArray jsonArray = response.optJSONArray("data");
        parseJson(jsonArray);
        adapter.resetSource(source);
        isLoadingData = false;
        swipeLayout.setRefreshing(false);
        //判斷請求回來數據的個數,後臺定義一頁有10條數據,如果小於10條,說明數據加載完畢,不用再去調加載更多的接口,反之就去加載
        if (jsonArray != null && jsonArray.length() >= 10) {
            praoseLv.resetFooterState(true);
        } else {
            praoseLv.resetFooterState(false);
        }
    }

    @Override
    public void error(VolleyError error, int errorCode, String errorMsg) {
        isLoadingData = false;
        swipeLayout.setRefreshing(false);
        if (error != null) {
            error.printStackTrace();
        } else {
            MyToast.showToast(this, errorMsg);
        }
    }

    /*
    解析json
    將arr中的obj循環遍歷拿出來,解析爲我們要的對象,在一個個add到source中
    比較麻煩,用gson可以直接解析爲我們要的List,然後addAll,如果是下拉刷新,或者加載第一頁
    這裏的方式是進行判斷,如果currentPage是1,那麼將source清空,否則就add
    */
    private void parseJson(JSONArray jsonArray) {
        if (jsonArray != null) {
            if (jsonArray.length() > 0) {
                int count = jsonArray.length();
                for (int i = 0; i < count; i++) {
                    SubjectVo uInfo = new SubjectVo().parse(jsonArray.optJSONObject(i));
                    source.add(uInfo);
                }
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章