做类似于选择题的安卓开发,刚刚上手,小白一个,最初使用simpleadapter写的listview发觉是个中看不中用的东西,内部的复杂控件无法监听,网上找说继承自baseadapter的功能更加强大,功能更多,最出名的是converview可以带来listview优化,网上很多博客介绍了这些。
但正是由于这个listview回收机制,是的用户的原有选定项被原封不动地回收重新利用,我们要做的就是在初次选择后记住用户的选择内容,并在回收利用时根据列表项的列表号进行对号入座地回复。
具体处理方法:
0.每个列表项都是一个包含问题和选项及其get set方法的类(Listitem)的对象(listitem),并将其添加到LIst<Listitem>集合中。
1.先取消radiogroup的监听能力,使其不会记录下一步操作。
2.在显示列表项时(gettag()之后)检查列表项的状态,该状态由下一步设定,利用内部的get方法。
3.进行监听,对选项的点击操作会利用set方法存到listitem中。
关键代码:
holder.questions.setText(mList.get(position).getQuestion());
//changeAnswers(position,holder);
holder.radioGroup.setId(position);
holder.radioGroup.setOnCheckedChangeListener(null);
switch(mList.get(position).getAnswerId()){
case 1:holder.radioGroup.check(R.id.rb1);break;
case 2:holder.radioGroup.check(R.id.rb2);break;
case 3:holder.radioGroup.check(R.id.rb3);break;
case 4:holder.radioGroup.check(R.id.rb4);break;
case 5:holder.radioGroup.check(R.id.rb5);break;
default:holder.radioGroup.clearCheck();break;
}
holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
ListItem temp=mList.get(group.getId());
switch (checkedId){
case R.id.rb1:temp.setAnswerId(1);
Toast.makeText(group.getContext(),"rb1 confirmed",Toast.LENGTH_SHORT).show(); break;
case R.id.rb2:temp.setAnswerId(2);break;
case R.id.rb3:temp.setAnswerId(3);break;
case R.id.rb4:temp.setAnswerId(4);break;
case R.id.rb5:temp.setAnswerId(5);break;
default:break;
}
}
});
完整代码:https://github.com/hedefu999/CATest/tree/master/app/src/main/java/com/example/lsq/catest
刚刚搞好,凑合看吧代码有很多冗余,这只是我的项目中的一个难题。
有图有真相:
彩蛋:大家帮我看看这机子啥配置,敢这么玩
求资助这人想mac想疯了