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