Java Listview-更改项目的背景颜色
我试图更改用户在listview中已单击的行的背景颜色,为此,我使用保存在SharedReferences中的arraylist,其中包含单击行的ID,问题是颜色几乎是随机更改的 代码:Java Listview-更改项目的背景颜色,java,android,listview,Java,Android,Listview,我试图更改用户在listview中已单击的行的背景颜色,为此,我使用保存在SharedReferences中的arraylist,其中包含单击行的ID,问题是颜色几乎是随机更改的 代码: 私有静态类ItemHolder{ 公共文本视图TXTTitle、txtArtister、TXTid、TXTLikes; 公共相对人退后; } @凌驾 公共视图getView(最终整数位置、视图视图、视图组根){ ItemHolder=新ItemHolder(); 如果(视图==null){ 视图=充气机。充气(
私有静态类ItemHolder{
公共文本视图TXTTitle、txtArtister、TXTid、TXTLikes;
公共相对人退后;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组根){
ItemHolder=新ItemHolder();
如果(视图==null){
视图=充气机。充气(R.layout.list\u项,根,假);
RelativeLayout\u back=(RelativeLayout)view.findViewById(R.id.bg\u项);
holder.back=\u back;
//画老歌
Set _Set=new HashSet();
_set=Prefs.getStringSet(“arrOfOldies”,_set);
对于(int i=0;i您犯了一个小错误,请在检索现有支架后移动background
零件。
下面是要使用的干净代码
private static class ItemHolder
{
public TextView TXTTitle, TXTArtist, TXTid, TXTLikes;
public RelativeLayout back;
@Override
public View getView(final int position, View view, ViewGroup root)
{
ItemHolder holder = null;
if (view == null)
{
view = inflater.inflate(R.layout.list_item, root, false);
holder = new ItemHolder();
holder.back = (RelativeLayout) view.findViewById(R.id.bg_item);
view.setTag(holder);
}
else
{
holder = (ItemHolder) view.getTag();
}
// paint oldies
Set<String> _set = new HashSet<String>();
_set = Prefs.getStringSet("arrOfOldies", _set);
if(_set.contains(IDs.get(position)))
{
//oldie
holder.back.setBackgroundColor(Color.parseColor("#D0D0D0"));
}else{
holder.back.setBackgroundColor(Color.parseColor("#ffffff"));
}
}
}
私有静态类ItemHolder
{
公共文本视图TXTTitle、txtArtister、TXTid、TXTLikes;
公共相对人退后;
@凌驾
公共视图getView(最终整数位置、视图视图、视图组根)
{
ItemHolder=null;
如果(视图==null)
{
视图=充气机。充气(R.layout.list\u项,根,假);
holder=新的ItemHolder();
holder.back=(RelativeLayout)view.findViewById(R.id.bg_项);
视图.设置标签(支架);
}
其他的
{
holder=(ItemHolder)view.getTag();
}
//画老歌
Set _Set=new HashSet();
_set=Prefs.getStringSet(“arrOfOldies”,_set);
if(_set.contains(IDs.get(position)))
{
//老歌
holder.back.setBackgroundColor(Color.parseColor(“#d0”));
}否则{
holder.back.setBackgroundColor(Color.parseColor(“#ffffff”));
}
}
}
我想补充马尼托巴省的答案,如果项目从未被选中,您还必须重置背景。
了解使用convertView和项目持有者的目的是重用视图进行优化。如果您重用项目中的视图,而该视图是为从未使用过的项目选择的:背景色仍将保留在此处
尝试:
@覆盖
公共视图getView(最终整数位置、视图视图、视图组根)
{
ItemHolder=null;
如果(视图==null)
{
视图=充气机。充气(R.layout.list\u项,根,假);
holder=新的ItemHolder();
holder.back=(RelativeLayout)view.findViewById(R.id.bg_项);
视图.设置标签(支架);
}
其他的
{
holder=(ItemHolder)view.getTag();
}
//画老歌
Set _Set=new HashSet();
_set=Prefs.getStringSet(“arrOfOldies”,_set);
对于(int i=0;i您的逻辑是错误的。您的代码中没有考虑回收列表视图。此外,您不需要检查_集合中包含项目的次数是否与集合中包含对象的次数相同。您应该重构代码以反映以下几点:
- 你最大的问题是,除非你的视图为空,否则你永远不会设置你的holper变量,而且只有当列表项同时出现在你的屏幕上时,它才是空的-当它们被回收时,你的颜色会变得奇怪。解决这个问题,它就会得到解决。下面是一些例子
- 将您的_集合移出getView函数
- 摆脱循环迭代_集的值
您如何处理支架
?请发布上述代码。整个适配器将非常好;)整个事情是巨大的,所以我添加了更多的itCheck,这一个重点是holder patren,所以你不需要在数组中保存选择来获得答案,但是背景一直在随机变化,它以正确的方式开始,但当我滚动到相同的问题时会发生变化
private static class ItemHolder
{
public TextView TXTTitle, TXTArtist, TXTid, TXTLikes;
public RelativeLayout back;
@Override
public View getView(final int position, View view, ViewGroup root)
{
ItemHolder holder = null;
if (view == null)
{
view = inflater.inflate(R.layout.list_item, root, false);
holder = new ItemHolder();
holder.back = (RelativeLayout) view.findViewById(R.id.bg_item);
view.setTag(holder);
}
else
{
holder = (ItemHolder) view.getTag();
}
// paint oldies
Set<String> _set = new HashSet<String>();
_set = Prefs.getStringSet("arrOfOldies", _set);
if(_set.contains(IDs.get(position)))
{
//oldie
holder.back.setBackgroundColor(Color.parseColor("#D0D0D0"));
}else{
holder.back.setBackgroundColor(Color.parseColor("#ffffff"));
}
}
}
@Override
public View getView(final int position, View view, ViewGroup root)
{
ItemHolder holder = null;
if (view == null)
{
view = inflater.inflate(R.layout.list_item, root, false);
holder = new ItemHolder();
holder.back = (RelativeLayout) view.findViewById(R.id.bg_item);
view.setTag(holder);
}
else
{
holder = (ItemHolder) view.getTag();
}
// paint oldies
Set<String> _set = new HashSet<String>();
_set = Prefs.getStringSet("arrOfOldies", _set);
for(int i = 0; i <= _set.size() ; i++)
{
if(_set.contains(IDs.get(position)))
{
holder.back.setBackgroundColor(Color.parseColor("#D0D0D0"));
}
else
{
//add this else clause.
holder.back.setBackgroundColor( YOUR_DEFAULT_BACKGROUND_COLOR );
}
}
}