安卓Variable‘position‘is accessed from within inner class, needs to be declared final问题

废话之后再说,先上解决方案:
在你的getView方法的形参 int position前加上final,如图:
在这里插入图片描述
我们在做安卓软件开发时制作的ListView通常都需要设置若干监听事件,BaseAdapter便是理想的适配器。
今天记录一个在使用此适配器的时候遇到的一个小问题
出现题目问题的原因是,我在ListView上放了一个Button按钮,目的是想要对Button对应的商品进行数据的操作。如图:
在这里插入图片描述
界面不甚美观,UI大神轻喷。。
我报错的代码是这样的:
在这里插入图片描述
其实一开始我是想定义一个变量来获取position的值,算是偷梁换柱,然后我成功了!不报错了!
代码如下:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(getContext(), R.layout.listview, null);
                holder = new ViewHolder();
                holder.img = convertView.findViewById(R.id.img);
                holder.name = convertView.findViewById(R.id.gname);
                holder.price = convertView.findViewById(R.id.price);
                holder.date = convertView.findViewById(R.id.gdate);
                holder.add= convertView.findViewById(R.id.add);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            try {
            	p=position;//这里的p是我一开始定义的静态int(其实不是静态也可以,芜嗦胃的)
                final String url = goods.getJSONObject(position).getString("address");
                Glide.with(getContext()).load(url).into(holder.img);
                holder.name.setText(goods.getJSONObject(position).getString("gname"));
                holder.price.setText(goods.getJSONObject(position).getString("price"));
                holder.date.setText(goods.getJSONObject(position).getString("date"));
                holder.add.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            String gname =goods.getJSONObject(p).getString("gname");//这里就用p来代替position了
                            int price =goods.getJSONObject(p).getInt("price");
                            JSONObject good = new JSONObject();
                            good.put("gname",gname);
                            good.put("price",price);
                            HttpUtil.connection(HomeFragment.class, good, "AddGoodsServlet");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (JSONException e) {
                e.printStackTrace();
            }

然后,我运行程序,没有任何问题
但是当我点击“可比克”对应的Button后,数据库显示我加入购物车的是哑铃??为毛啊,淦
然后我陷入了沉思,想通了,这个position应该只对应的是最新出现的那个View,我的界面最后显示的是哑铃,所以不管是点击哪个Button,它都已经是哑铃的人了。
为了验证我的想法,我从下往上去翻这个列表后,position果然又指向了最上面新出现的那条View了。
意思是,这个position是一直变化的,所有已经出现的View,会随新出现的View一起变化position的值。
所以为了不让已经产生的position发生变化,把它定义成final,自然就解决这个问题了。
应该是我对这个适配器还不了解,所以这种小问题都不懂,今天在此记录一下这个,加深印象。
PS:文中的知识点仅是我个人想法,有错的还请各位指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值