Android下拉刷新与菜单及ListView的应用

Android下拉刷新与菜单及ListView的应用

刷新组件使用的是Yalantis出品的Phoenix Pull-to-Refresh-Android

这里写图片描述

这里写图片描述

这里写图片描述

利用handle与setTag通信

网络通信获得数据信息无法在UI线程中,所以对每个菜单选项设置一个init方法启动新线程获得数据,以及一个更新Listview数据的Loading方法,这里需要注意,listview的数据更新需要在UI线程中,所以不能再init方法中直接更新List数据,否则会产生不可预见的运行时异常。网络线程在完成后发送Message至UI线程,在UI线程中Handler获得信息调用各菜单选项的Load方法

private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //获得刚才发送的Message对象,然后在这里进行UI操作
            Log.d("result",Integer.toString(msg.what)+"load");
            switch (msg.what){
                case 1:
                    loadBanji((String)msg.obj);
                    break;
            }
        }
    };

public void initBanji(){

        new Thread(){
            @Override
            public void run()
            {
                jsonArray=HttpClient.getClassList();
                Message message=new Message();
                message.what=1;
                message.obj=jsonArray.toString();
                mHandler.sendMessage(message);
            }
        }.start();
    }
    public void loadBanji(String jsonArrayStr){
        classList.clear();

        Log.d("result",jsonArrayStr);

        JSONArray jsonArray= null;
        try {
            jsonArray = new JSONArray(jsonArrayStr);
            for (int i=0;i<jsonArray.length();i++){
                JSONObject jsonObject=jsonArray.getJSONObject(i);
                classList.add(new Class(jsonObject.getInt("id"),jsonObject.getString("name")));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        ClassAdapter adapter=new ClassAdapter(this,R.layout.class_layout,classList);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Class aclass=classList.get(position);

                Intent intent=new Intent(HomeTeacherActivity.this,ClassStudentActivity.class);
                intent.putExtra("id",aclass.getId());
                intent.putExtra("name",aclass.getName());
                startActivity(intent);
            }
        });
    }

当切换菜单选项时,给navigationView设置setTag,用以在刷新时调用对应的init方法

        mPullToRefreshView  = (PullToRefreshView) findViewById(R.id.content_teacher).findViewById(R.id.teacher_refresh);
        mPullToRefreshView.setOnRefreshListener(new PullToRefreshView.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mPullToRefreshView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("result","Navigation"+(String)navigationView.getTag());
                        switch ((String)navigationView.getTag()){
                            case "banji":
                                initBanji();
                                break;

                        }

                        mPullToRefreshView.setRefreshing(false);
                    }
                },500);
            }
        });

    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_banji) {
            // Handle the camera action
            initBanji();

            navigationView.setTag("banji");
        } else if (id == R.id.nav_lianxi) {

            navigationView.setTag("lianxi");
        } else if (id == R.id.nav_zuoye) {

            navigationView.setTag("zuoye");
        } else if (id == R.id.nav_exam) {

            navigationView.setTag("exam");
        } else if (id == R.id.nav_fenshu) {

            navigationView.setTag("fenshu");
        }else if (id==R.id.nav_Logout){
            Intent intent=new Intent(HomeTeacherActivity.this,LoginActivity.class);
            startActivity(intent);
            finish();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

总结

在自己开发app中,遇到了Listview数据更新在子线程中会在某次中产生异常,仅此来记录一下自己掉过的坑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值