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