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

时间:2014-03-07 16:07:08

标签: android android-layout android-listview

我正在尝试让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);

1 个答案:

答案 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)方法

将适配器设置为列表视图

可以找到包含创建AdapterViewHolder的体面教程here

进一步阅读: