往ListView中放入十个按钮
刚刚接触安卓不久,这是老师留给我们的作业,作为小白花了两天才实现,在这个社区别人的博客里获得了不少的帮助,也想在这里记录一下我的小小成果和改错历程,希望也能给别的初学者一点帮助,如果我的思考出现了错误和偏差,我更加希望能被大家指出来。
最开始我想套用课本上的“ListView的简单用法”来实现,但是尝试了许久都无法实现。在寻找资料的过程中,本站Lshare的一篇博客详细讲解了ListView及ListAdapter,给了我很大帮助,最后成品的框架便是从那里来的。贴上网址以供参考ListView及ListAdapter详解—Lshare
程序完成前有一个折磨了我很久的空指针异常:Attempt to invoke virtual method.’…Button‘.on a null object reference. 最后在本站TNove的一篇博客受到启发。也贴上网址Android开发中出现Attempt to invoke virtual method…on a null object reference----TNove
其中部分代码如下:
listView.setAdapter(new ArrayAdapter<String>
(MainActivity.this,R.layout.button_item,buttonNames)
{
@Override
public View getView(final int position, @Nullable View convertView
, @NonNull ViewGroup parent) {
View view=null;
if(convertView!=null){
view=convertView; //重用加载好的布局
}else {
view= LayoutInflater.from(getContext()).inflate
(R.layout.button_item,null);
}
Button button = view.findViewById(R.id.button_layout);
button.setText(buttonNames.get(position));
刚开始我的button一直没有办法获取到实例,总是出现空指针错误。明明我又关联好了,最后感觉可能是if语句判断出了第一种结果,导致button的布局没有被传入。于是我将if… else语句注释掉,只留下else语句里面的内容,终于实现了老师的要求。
我在课本里发现了被我注释掉的convertView参数的作用:
getView()方法中有一个convertView参数,用于将之前加载好的布局进行缓存,以便之后可以进行重用。
我估计是由于我在这个button未加进去时就加载开程序查看过,所以conver根据判断我的view依然是之前未存在button的view,所以当时button无法实例化,也就无法进行setText()等操作。(不知道我的表述有没有问题。。。)
于是我将注释掉的if…else语句重新显示出来,程序依然能正常运行(由于converView中已经缓存了刚刚成功打开的真正需要的布局,所以能够正确显示了)。
最后希望自己继续加油,不要被困难打败!