自定义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;
}
特记下,以备后日回顾。