Android 为什么我的ListView的第一项和最后一项是通过心灵感应链接的?
我正在尝试获取一个ListView,以便在选择元素时切换其背景颜色(用于选择要添加到播放列表中的歌曲)。我已经取得了很大的成功,但由于某些原因,每当ListView比屏幕长时,选择第一个或最后一个项目也会切换另一个项目的背景。我在一个名为selectedStatus的布尔数组中跟踪一个项目是否被选中,这里没有问题,因此这纯粹是一个UI问题 以下是代码的相关部分:Android 为什么我的ListView的第一项和最后一项是通过心灵感应链接的?,android,android-layout,android-listview,Android,Android Layout,Android Listview,我正在尝试获取一个ListView,以便在选择元素时切换其背景颜色(用于选择要添加到播放列表中的歌曲)。我已经取得了很大的成功,但由于某些原因,每当ListView比屏幕长时,选择第一个或最后一个项目也会切换另一个项目的背景。我在一个名为selectedStatus的布尔数组中跟踪一个项目是否被选中,这里没有问题,因此这纯粹是一个UI问题 以下是代码的相关部分: boolean selectedStatus{} = new boolean[songsList.size()]; @Overrid
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);
}
}
});
}
boolean selectedStatus{}=new boolean[songsList.size()];
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
lv=getListView();
//收听歌曲选择
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
int viewPosition=position-lv.getFirstVisiblePosition();
如果(已选择状态[位置]){
selectedStatus[位置]=假;
View currentEntry=lv.getChildAt(视图位置);
currentEntry.setBackgroundResource(R.color.footercolor);
}
否则{
selectedStatus[位置]=真;
View currentEntry=lv.getChildAt(视图位置);
currentEntry.setBackgroundResource(R.color.selected);
}
}
});
}
关于ListView,我肯定缺少一些实现细节,但我不明白为什么会发生这种情况
编辑:通过更多的测试,我意识到它实际上将所有列表元素与mod 12相等的位置链接起来,我只是看的列表不够长。这看起来没那么奇怪,只是重用了元素,我必须研究一下这个ViewHolder的想法
由于有几个人询问,以下是我制作适配器和填充列表的全部代码:
// Adding items to ListView
ListAdapter adapter = new ArrayAdapter<String>(getActivity(),
R.layout.playlist_builder_item, songnamesList);
setListAdapter(adapter);
//向ListView添加项目
ListAdapter=new ArrayAdapter(getActivity(),
R.layout.playlist\u builder\u项目,歌曲名称列表);
setListAdapter(适配器);
听起来您可能需要创建一个合适的列表适配器
,并实现一个视图持有者
ViewHolder避免了AndroidListView
实现的布局重用,因此您可以通过依赖与以前相同的视图来完成稍微复杂的事情
您应该保留在静态类中更改的视图
。例如:
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方法将适配器设置为listview
您可以找到一个不错的教程,其中包括创建适配器
和视窗夹
进一步阅读:
- 关于列表视图
- 关于列表视图
如何设置listview项目?我需要知道您的适配器使用的是什么?你有自己的扩展baseAdapter吗?谢谢你对我做错了什么做了很好的解释。这与R Quijano在下面评论中的链接帖子一起,使事情得以顺利进行。