[英]Change a precise item color in a listview in JAVAFX without changing all of them
[英]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是否包含您的商品,因為您的商品中有很多對象。 您應該重構代碼以反映以下幾點:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.