Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我的ListView的第一项和最后一项是通过心灵感应链接的?_Android_Android Layout_Android Listview - Fatal编程技术网

Android 为什么我的ListView的第一项和最后一项是通过心灵感应链接的?

Android 为什么我的ListView的第一项和最后一项是通过心灵感应链接的?,android,android-layout,android-listview,Android,Android Layout,Android Listview,我正在尝试获取一个ListView,以便在选择元素时切换其背景颜色(用于选择要添加到播放列表中的歌曲)。我已经取得了很大的成功,但由于某些原因,每当ListView比屏幕长时,选择第一个或最后一个项目也会切换另一个项目的背景。我在一个名为selectedStatus的布尔数组中跟踪一个项目是否被选中,这里没有问题,因此这纯粹是一个UI问题 以下是代码的相关部分: boolean selectedStatus{} = new boolean[songsList.size()]; @Overrid

我正在尝试获取一个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);
            }
        }
    });
}
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避免了Android
ListView
实现的布局重用,因此您可以通过依赖与以前相同的
视图来完成稍微复杂的事情

您应该保留在静态类中更改的
视图
。例如:

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在下面评论中的链接帖子一起,使事情得以顺利进行。