Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Listview-更改项目的背景颜色_Java_Android_Listview - Fatal编程技术网

Java Listview-更改项目的背景颜色

Java Listview-更改项目的背景颜色,java,android,listview,Java,Android,Listview,我试图更改用户在listview中已单击的行的背景颜色,为此,我使用保存在SharedReferences中的arraylist,其中包含单击行的ID,问题是颜色几乎是随机更改的 代码: 私有静态类ItemHolder{ 公共文本视图TXTTitle、txtArtister、TXTid、TXTLikes; 公共相对人退后; } @凌驾 公共视图getView(最终整数位置、视图视图、视图组根){ ItemHolder=新ItemHolder(); 如果(视图==null){ 视图=充气机。充气(

我试图更改用户在listview中已单击的行的背景颜色,为此,我使用保存在SharedReferences中的arraylist,其中包含单击行的ID,问题是颜色几乎是随机更改的

代码:

私有静态类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 ); 
        }
    }
}