我知道如何通过onitemclicklistener访问listview项目,但我该如何做更改代码中的背景颜色。
sudo代码:
lv[0].setBackgroundResource(R.color.red); //change the background of the first listview item
有没有办法访问列表视图的每个视图?
答案 0 :(得分:2)
@Matt:这不是它的弱点,你必须要了解它的运作方式。
Yellavon,在任何给定时间,您的ListView仅包含可见项目,因此您无法直接访问和更改项目。当它们滚出视图时,视图将被回收,并由ListAdapter填充数据。在此适配器中,您需要处理项目应该不同的情况。如果您已经在getView()
方法中创建了自己的自定义ListAdapter(例如ArrayAdapter,BaseAdapter),只需添加一些逻辑来处理背景颜色应该更改的情况。
比方说,你有一个整数列表,你想要任何整数> = 50以红色显示:
if(items.get(position) >= 50) {
myView.setBackgroundColor("#FF0000");
} else {
myView.setBackgroundColor("#000000");
}
(确保处理其他情况非常重要,因为您可能会获得红色项目的回收视图。在这种情况下,您必须将其重置为您需要的任何默认背景颜色。 )
如果您从未构建自定义适配器,则this excerpt from CommonsWare's book创建自定义ListAdapter是一个很好的资源。
编辑:根据你的评论进一步思考:
在您的自定义ExpandableListAdapter
中private Object lastSelectedObject;
public void setLastSelectedObject(Object obj) {
lastSelectedObject = obj;
}
public Object getLastSelectedObject() {
return lastSelectedObject;
}
在ListActivity中实施onListItemClick(ListView l, View v, int pos, long id)
@Override
protected void onListItemClick(ListView l, View v, int pos, long id) {
super.onListItemClick(l, v, pos, id);
((CustomAdapter)l.getAdapter()).setLastSelectedObject(items.get(pos));
}
现在,回到getView()
Object obj = getLastSelectedObject();
if(obj != null) {
//handle background switching for your View here
} else {
//reset background to default for recycled views
}
答案 1 :(得分:0)
int first = view.getFirstVisiblePosition();
int count = view.getChildCount();
for (int i=0; i<count; i++) {
TextView t = (TextView)view.getChildAt(i);
if (t.getTag() != null) {
t.setText(mStrings[first + i]);
t.setTag(null);
}
}
看起来像getChildAt是你正在寻找的方法。
答案 2 :(得分:-1)
android中的ListView类很弱。
对你的问题的简短回答是否定的,不容易。
有人在Google I / O上询问了这个问题,而android团队的回答是使用垂直填充的LinearLayout,只是添加了一堆子视图(基本上它给了它与ListView相同的功能)。
您可以使用getChild(x)获取任何视图