簡體   English   中英

Listview-更改項目的背景色

[英]Listview - changing the backgrond color of an item

我試圖更改用戶已經在列表視圖中單擊的行的背景色,為此,我使用的是保存在SharedPreferences中的arraylist,以使被單擊的行的ID繼續,問題是顏色幾乎是隨機變化的。

碼:

    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 = new ItemHolder();

        if (view == null) {
            view = inflater.inflate(R.layout.list_item, root, false);

            RelativeLayout _back = (RelativeLayout) view.findViewById(R.id.bg_item);

            holder.back = _back;

            // 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))){
                //oldie
                            holder.back.setBackgroundColor(Color.parseColor("#D0D0D0"));
                    }
            }

            view.setTag(holder);
        } else {
                holder = (ItemHolder) view.getTag();       
        }
    }

我認為這與構建Listview的方式有關,有什么問題以及如何解決?

我想補充一下馬尼托巴省的答案,如果從未選擇過該項目,您還必須重置背景。 理解使用convertView和項目持有者的意義在於重用視圖進行優化。 如果您從從未為某項目選擇的項目中重用視圖,則背景顏色仍將保留在此處。

嘗試:

@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 ); 
        }
    }
}

您犯了一個小錯誤,請在獲取現有持有人之后移動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"));
        }
    }
}

你的邏輯是錯誤的。 您沒有在代碼中考慮回收ListViews。 同樣,您無需檢查_set是否包含您的商品,因為您的商品中有很多對象。 您應該重構代碼以反映以下幾點:

  • 您的最大問題是,除非視圖為null,否則永遠不要設置holper變量,並且它的null只能是屏幕上同時適合列表項的次數-當它們被回收時,顏色會變得很奇怪。 解決此問題,它將解決。 這是一些ListView回收信息
  • 將_set移出getView函數
  • 擺脫for循環迭代_set的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM