安卓listview item内部控件操作方法

本文介绍两种在Android中操作自定义ListView的方法:一是通过getChildAt获取子项位置,但需注意position指可见子项而非数据集下标;二是利用Adapter预设不同状态的展示逻辑,结合数据改变时的notifyDataSetChanged()调用,确保状态一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    自定义listview使用司空见惯,很多时候需要对listview中某一行的内部控件进行操作,加载动画等。本文就如何获取内部空间进行操作简述一下方法。

    第一种方法,通过listview的getchildAt(position)方法。实例代码如下:

ImageView img_del = (ImageView) dragSortListView.getChildAt(position).findViewById(R.id.img_del);
img_del.setImageResource(R.drawable.icon_load);
          获取到布局后再findviewbyid可以获取到控件对象,之后可进行操作。但是getchildAt这种方法存在问题,getchildAt中的position并不是list中的下标,而是返回的本页面可见的listitem的下标,正确做法是dragSortListView.getChildAt(position - listview.getFirstVisiblePosition())这样可以获取到正确的位置。getFirstVisiblePosition是指当前list view界面的一个item的position。这样可以实现对某一行中的控件进行控制操作

    但是如果需要保存当前listview中执行状态上述方法并不可行。若listview中存放的是表示一系列任务的执行,第一种造成了数据错乱。如下图,需要执行一系列的ping任务,未执行前显示等待标志,执行中加载旋转动画,执行后显示执行结果。


     第二种方法,再自定义的adapter的getview方法中预先写好对于不同的结果的应对,代码如下:

   viewHolder.pingAddress.setText(item.getAddress());
        if (item.getState() == 1)//未执行状态
            viewHolder.img_progress.setImageResource(R.drawable.ic_wait);
        else if (item.getState() == 2)//成功状态
            viewHolder.img_progress.setImageResource(R.drawable.icon_suc);
        else if (item.getState() == 3)//失败状态
            viewHolder.img_progress.setImageResource(R.drawable.ic_fail);
        if (item.isTest()) {//正在运行状态
            viewHolder.img_progress.setImageResource(R.drawable.icon_load);
            viewHolder.img_progress.startAnimation(operatingAnim);
        } else
            viewHolder.img_progress.clearAnimation();
当然需要预先抽象出自定义的结果类,PingResBean存放过程参数。

    当activity中的执行完任务数据数据发生了变化的时候,调用如下即可更新UI。当调用notifydatasetchanged方法时会重新调用adapter中的getview方法,重新绘制listview的UI,这样即可达到对listitem内部空间的控制更新到目的,并且可以保存状态,避免listview数据加载错乱。

                case MessageWhat.THREAD_START:
                position = (int) msg.obj;//对应list着数据的位置
                Log.i("PINGPING", position + "THREAD_START");
                pingList.get(position).setTest(true);//改变list中元素的属性
                adapter.setDataList(pingList);
                adapter.notifyDataSetChanged();//通知刷新
                break;

    给出getview方法完整实现:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        PingResBean item = (PingResBean) getItem(position);

        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(mcontext).inflate(R.layout.listitem_drag_ping, null);
            viewHolder.pingAddress = (TextView) convertView.findViewById(R.id.item_tv_ping_address);
            viewHolder.img_del = (ImageView) convertView.findViewById(R.id.img_del);
            viewHolder.img_progress = (ImageView) convertView.findViewById(R.id.img_progress);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.pingAddress.setText(item.getAddress());
        if (item.getState() == 1)//未执行状态
            viewHolder.img_progress.setImageResource(R.drawable.ic_wait);
        else if (item.getState() == 2)//成功状态
            viewHolder.img_progress.setImageResource(R.drawable.icon_suc);
        else if (item.getState() == 3)//失败状态
            viewHolder.img_progress.setImageResource(R.drawable.ic_fail);
        if (item.isTest()) {//正在运行状态
            viewHolder.img_progress.setImageResource(R.drawable.icon_load);
            viewHolder.img_progress.startAnimation(operatingAnim);
        } else
            viewHolder.img_progress.clearAnimation();
        return convertView;
    }
    特记下,以备后日回顾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值