ListView 将背景颜色设置为项目错误
ListView setting background color to an item ERROR
嗯,我有一个水平的 LinearLayout,带有自定义项 class。
我想要的: 更改我单击的项目的背景颜色(就像它被选中一样)。如果用户点击其他项目,第一个再次变为原始颜色,新的变为 "selected color"
我的问题是什么: 当 listView 的所有项目都适合屏幕时(在本例中为 3 个项目),这工作正常。如果有更多项目,比方说 7,如果用户点击项目编号 0,它会改变颜色,但如果用户滚动到最后一个项目并点击项目编号 6,它会改变颜色,但项目 0 不会改变。如果两个项目都可见,则它工作正常。
这是我的 onItemClickListener 的代码。
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
for(int i=0;i<listView.getCount();i++){
try{
getViewByPosition(i, listView).setBackgroundResource(R.drawable.skin);
listView.getChildAt(i).setBackgroundResource(R.drawable.skin);
}
catch(Exception e){
System.out.println(e.toString());
}
}
view.setBackgroundResource(R.drawable.skin_selected);
}
});
为什么不使用适配器进行修改?我想你使用的是自定义适配器?
在你的适配器中
public int selectedItem;
.
//Rest of the stuff
.
.
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (null == convertView) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
}
if(selectedItem==position){
convertView.setBackgroundResource(R.drawable.skin_selected);
}else{
convertView.setBackgroundResource(R.drawable.skin);
}
return convertView;
}
并且您的 onclick 侦听器变为:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
((NameOfYouAdpater)listView.getAdapter()).selectedItem=position;
((NameOfYouAdpater)listView.getAdapter()).notifyDataSetChanged();
}
});
而且我注意到您在 itself.Maybe 中使用自定义列表视图查看库的实现以检查干扰?
编辑:你的问题的原因很可能是 dude to view recycling.The 背景颜色没有得到更新,因为每次列表项在你的 ViewPort 之外,视图都会被回收。
嗯,我有一个水平的 LinearLayout,带有自定义项 class。
我想要的: 更改我单击的项目的背景颜色(就像它被选中一样)。如果用户点击其他项目,第一个再次变为原始颜色,新的变为 "selected color"
我的问题是什么: 当 listView 的所有项目都适合屏幕时(在本例中为 3 个项目),这工作正常。如果有更多项目,比方说 7,如果用户点击项目编号 0,它会改变颜色,但如果用户滚动到最后一个项目并点击项目编号 6,它会改变颜色,但项目 0 不会改变。如果两个项目都可见,则它工作正常。
这是我的 onItemClickListener 的代码。
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
for(int i=0;i<listView.getCount();i++){
try{
getViewByPosition(i, listView).setBackgroundResource(R.drawable.skin);
listView.getChildAt(i).setBackgroundResource(R.drawable.skin);
}
catch(Exception e){
System.out.println(e.toString());
}
}
view.setBackgroundResource(R.drawable.skin_selected);
}
});
为什么不使用适配器进行修改?我想你使用的是自定义适配器?
在你的适配器中
public int selectedItem;
.
//Rest of the stuff
.
.
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (null == convertView) {
LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, parent, false);
}
if(selectedItem==position){
convertView.setBackgroundResource(R.drawable.skin_selected);
}else{
convertView.setBackgroundResource(R.drawable.skin);
}
return convertView;
}
并且您的 onclick 侦听器变为:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(it.sephiroth.android.library.widget.AdapterView<?> parent, View view, int position, long id) {
((NameOfYouAdpater)listView.getAdapter()).selectedItem=position;
((NameOfYouAdpater)listView.getAdapter()).notifyDataSetChanged();
}
});
而且我注意到您在 itself.Maybe 中使用自定义列表视图查看库的实现以检查干扰?
编辑:你的问题的原因很可能是 dude to view recycling.The 背景颜色没有得到更新,因为每次列表项在你的 ViewPort 之外,视图都会被回收。