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

来源:互联网 发布:真实二手房源 知乎 编辑:程序博客网 时间:2024/05/16 12:21

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数据更新在子线程中会在某次中产生异常,仅此来记录一下自己掉过的坑。

原创粉丝点击