我正在尝试让ListView在其被选中时切换其元素的背景颜色(这是用于选择要添加到播放列表的歌曲)。我一直很成功,但出于某种原因,只要ListView比屏幕长,选择第一个或最后一个项目也会切换另一个项目的背景。我跟踪一个名为selectedStatus的布尔数组中是否选择了一个项目,并且那里没有问题,所以它纯粹是一个UI问题。
以下是代码的相关部分:
boolean selectedStatus{} = new boolean[songsList.size()];
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lv = getListView();
// listening for song selection
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
int viewPosition = position - lv.getFirstVisiblePosition();
if(selectedStatus[position]){
selectedStatus[position] = false;
View currentEntry = lv.getChildAt(viewPosition);
currentEntry.setBackgroundResource(R.color.footercolor);
}
else{
selectedStatus[position] = true;
View currentEntry = lv.getChildAt(viewPosition);
currentEntry.setBackgroundResource(R.color.selected);
}
}
});
}
必须有一些我缺少的ListViews的实现细节,但我无法弄清楚为什么会发生这种情况。
编辑:我已经意识到更多的测试它实际上链接所有列表元素与等于mod 12的位置,我只是没有看足够长的列表。这似乎不那么奇怪,它只是重用元素,我将不得不研究这个ViewHolder的想法。由于有几个人问,这是我制作适配器和填充列表的所有代码:
// Adding items to ListView
ListAdapter adapter = new ArrayAdapter<String>(getActivity(),
R.layout.playlist_builder_item, songnamesList);
setListAdapter(adapter);
答案 0 :(得分:0)
听起来您可能需要创建一个合适的ListAdapter
并实施ViewHolder
。
ViewHolder避免了Android ListView
实现的布局重用,因此您可以依靠与之前相同的Views
来执行稍微复杂的操作。
您应该抓住您在静态课程中更改的View
。例如:
static class ViewHolder {
ImageView backgroundItem;
}
然后在您的适配器的getView
方法中,您希望获得ViewHolder
,如果我们要创建新视图,我们将其设置为新视图,否则我们会重复使用我们拥有的旧视图设置为原始标记。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
// Inflate the view as we normally would
// Create a new ViewHolder
// Set our ImageView to be equal to viewHolder's backgroundItem
// final step
convertView.setTag(viewHolder);
}else{
// use the original ViewHolder that was already saved as a tag
viewHolder = (ViewHolder) convertView.getTag();
}
// Set the background as per your own code
// Return the convertView
return convertView;
}
不要忘记通过调用ListView setAdapter(ListAdapter adapter)方法
将适配器设置为列表视图可以找到包含创建Adapter
和ViewHolder
的体面教程here。
进一步阅读: