Android ListView条目按钮点击状态混乱解决方案

出现问题:

    点击listView item上的button按钮,点击改变button的显示状态,滑动listView条目上的button被复用,条目上对应button状态不对应,条目上button状态混乱。

分析原因:

   ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过Adapter的getView函数获得每行的item。滑动过程中,

   a.如果某行item已经滑出屏幕,若改item不在缓存内,则put进缓存,否则更新缓存;

   b.获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,如果有,作为convertView参数传递给adapter的getView。

   这样,getView写法就可以充分利用缓存大大提升ListView的性能。即便上万个行item,最多inflate的次数为n,n为一屏最多显示ListView行item的个数。

   根据上面的缓存原理,listView的复用,便会造成item上控件状态的混乱。

   具体分析详见     http://www.trinea.cn/android/android-listview-display-error-image-when-scroll/

解决方案:

   Java编程思想万物皆对象。如果把item的状态记录在 每item上对应对象中,通过对象的字段,每次点击改变对象的字段值,每次显示item上控件的状态通过判断对象字段值。混乱状态问题,便得解决。

  无故为条目对象增加字段,而服务器上并不需要该字段,为了统一前后端,这样又会造成麻烦。所以,我们在给对象添加,状态判断的boolean值时,在bean中的该字段前加字段修饰关键字 transient 。For example,bean中添加的判断boolean值为isCheck,那么在bean中则为 private transient boolean isCheck;

  transient 顾名思义: (From Youdao Dict)

  • adj. 短暂的;路过的
  • n. 瞬变现象;过往旅客;候鸟

而在java中,“transient”修饰符(modifier)就是一个专用的annotation,用来表明被修饰的字段(field)在序列化(serilization)的时候被忽略。

具体分析详见    http://www.cnblogs.com/gaojing/archive/2011/04/14/2844973.html

总结:

   所以,给条目对象,增加字段(为了记录该对象的状态),并在字段前加 transient 修饰关键字,便可迎刃而解ListView条目按钮点击状态混乱问题~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当用户点击Android ListView中的按钮时,您可以使用适配器中的getView()方法来处理该事件。在getView()方法中,您可以为每个按钮设置一个单击侦听器,并在单击事件发生时执行所需的操作。您还可以使用setTag()方法将按钮与其相关的数据对象关联起来,以便在单击事件发生时访问该对象。例如,您可以使用以下代码在适配器中处理按钮单击事件: public View getView(int position, View convertView, ViewGroup parent) { // Get the data item for this position final MyDataObject dataObject = getItem(position); // Check if an existing view is being reused, otherwise inflate the view if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_list_item, parent, false); } // Lookup view for data population TextView tvName = (TextView) convertView.findViewById(R.id.tvName); Button btnAction = (Button) convertView.findViewById(R.id.btnAction); // Populate the data into the template view using the data object tvName.setText(dataObject.getName()); btnAction.setTag(dataObject); btnAction.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Perform action on click MyDataObject clickedObject = (MyDataObject) v.getTag(); // Do something with the clicked object } }); // Return the completed view to render on screen return convertView; } 在上面的代码中,我们为按钮设置了一个单击侦听器,并使用setTag()方法将按钮与其相关的数据对象关联起来。在单击事件发生时,我们可以使用getTag()方法访问该对象,并执行所需的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值