getChildAt返回两项?

时间:2014-11-10 19:57:18

标签: android android-listview

protected void onListItemClick(ListView l,View v,int position,long id)方法中我使用

lv.getChildAt(position-lv.getFirstVisiblePosition()).setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

但两个元素的背景正在改变前。单击第一个元素(索引0)#0和#8更改,单击第二个项目(索引1)#1和#9更改,单击第9个项目(索引8)#8和#1更改。发生了什么事?

---- ---- EDIT

我使用参数v而不是lv.getChiledAt。它看起来像是:

v.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

它的工作方式仍然相同。我不知道问题出在哪里:listview,adapter,onlistitemclick方法?我使用最简单的适配器:

lv = (ListView) findViewById(android.R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, values);
lv.setAdapter(adapter);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

- - - - ---- EDIT2 好的,还有一件事。单击元素后,我将其值添加到列表中。它工作正常:在列表中只添加了一个元素 - 但是有两个位置突出显示。所以这个问题在某个地方有了...我可以编写自定义适配器,但在这种情况下看起来很复杂。我宁愿理解为什么这个简单的解决方案不起作用。

3 个答案:

答案 0 :(得分:1)

Listview重用已创建的视图以获得更好的性能。当您更改列表中视图的背景颜色时,您将在滚动列表时看到它。因为相同的视图再次出现不同的数据。

答案 1 :(得分:0)

试试这个。在您的自定义适配器

public View getView(int position,View convertView,ViewGroup parent){

    ViewHolder holder;

if (convertView == null) {
    convertView = mInflater.inflate(R.layout.your_layout, null);

    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);

    convertView.setTag(holder);
} else {
    holder = convertView.getTag();
}

//做你想做的任何事情     holder.text.setText(&#34; Position&#34; + position);

if(highlightedPosition == position) {
convertView.setBackgroundColor(getResources()的getColor(android.R.color.darker_gray));
}
否则
{
convertView.setBackgroundColor(getResources()的getColor(android.R.color.black));
}

return convertView;

}

私有静态类ViewHolder {
    公共TextView文本;
//你的其他观点在这里
}

public void highlightPosition(int highlightedPosition){
 this.highlightedPosition = highlightedPosition;
notifyDatasetChanged();
}

答案 2 :(得分:0)

创建本地View类而不是ViewHolder:

ItemView类:

private static /* or not */ class ItemView extends FrameLayout /* or something else you want */ {
    final View mParent;
    final TextView mTitle;

    public ItemView(Context context) {
        super(context);
        addView(mParent = inflate(context, R.layout.item_something, null));

        mTitle = (TextView) mParent.findViewById(R.id.title);
    }

    public void setItem(Object/*Item type*/ item) {
        mTitle.setText(item.getTitle());
        /* do anything you want here */
    }
}

适配器getView:

final ItemView itemView;
if(convertView != null && convertView instanceOf ItemView) {
    itemView = (ItemView) convertView;
} else {
    itemView = new ItemView(context);
}
itemView.setItem((ItemType) getItem(position));
return itemView;