2013-05-20 67 views
0

我有一個Listview(顯示在一個AlertDialog中),由兩列組成,用HashMap(這裏有個想法)做出來。 每列是TextView。它運作良好。如何設置Listview項目的第一列的顏色?

現在我想改變給定行的第一列的textcolor,但我不知道如何選擇和設置...我GOOGLE了幾個小時!任何線索?

這是我的代碼(listsSortedSet):

public void showlistdesc() { 
    ListView listview = new ListView(this); 
    listview.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    listview.setSoundEffectsEnabled(true); 
    listview.setSelector(R.drawable.selector); 

    Integer i=0, pos = 0; 
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> map; 
    for (String l : lists) { 
     if (l.equals(currlist)) pos = i; 
     i++; 
     map = new HashMap<String, String>(); 
     map.put("list", l); 
     map.put("desc", getlistdesc(l, false)); 
     mylist.add(map); 
    } 

    listview.setAdapter(new SimpleAdapter(this, mylist, R.layout.lists_row, 
       new String[] {"list", "desc"}, new int[] {R.id.list1, R.id.desc1})); 

    AlertDialog.Builder builder = new AlertDialog.Builder(AveActivity.this) 
      .setView(listview) 
      .setIcon(R.drawable.ic_launcher) 
      .setTitle(lists.size() + " bird lists in databases"); 

    final AlertDialog dial = builder.create(); 

    //Scrolls the listview to this position at top 
    listview.setSelection(pos); 

    dial.show(); 
} 

謝謝!

編輯

試過用下面的代碼擴展SimpleAdapter,和所有我能看到的是純黑色行:

public class MySimpleAdapter extends SimpleAdapter { 
private Context context; 

public MySimpleAdapter(Context context,List<? extends Map<String, ?>> data, 
     int resource, String[] from, int[] to) { 
    super(context, data, resource, from, to); 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) this.context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.lists_row, null); 
    } 

    TextView list1 = ((TextView) v.findViewById(R.id.list1)); 
    TextView desc1 = ((TextView) v.findViewById(R.id.desc1)); 

    if (v.isPressed()) { 
     v.setBackgroundColor(context.getResources().getColor(R.color.pressed)); 
     list1.setTypeface(null, 1); 
     list1.setTextColor(context.getResources().getColor(R.color.selected)); 
    } else { 
     v.setBackgroundColor(context.getResources().getColor(R.color.black)); 
     if (v.isSelected()) { 
      list1.setTypeface(null, 1); 
      list1.setTextColor(context.getResources().getColor(R.color.checked)); 
      desc1.setTextColor(context.getResources().getColor(R.color.white)); 
     } else { 
      list1.setTypeface(null, 0); 
      list1.setTextColor(context.getResources().getColor(R.color.normal)); 
      desc1.setTextColor(context.getResources().getColor(R.color.lesswhite)); 
     } 
    } 

    return v; 
} 
} 

回答

0

我找到了一個解決方案,基本上包含在這裏的幾個職位。 我所做的就是使用listview.setItemChecked(pos, true);,這是我之前嘗試過的失敗之處,因爲它什麼也沒有顯示。問題是LinearLayout未執行Checkable。所以我實現它(代碼在這裏基本上找到某處):

public class CheckableLinearLayout extends LinearLayout implements Checkable { 
private boolean isChecked; 

public CheckableLinearLayout(Context context) { 
    super(context); 
} 

public CheckableLinearLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void setChecked(boolean isChecked) { 
    this.isChecked = isChecked; 
    TextView list1 = ((TextView) findViewById(R.id.list1)); 
    TextView desc1 = ((TextView) findViewById(R.id.desc1)); 
    if (isPressed()) { 
     list1.setTextColor(getResources().getColor(R.color.selected)); 
     setBackgroundColor(getResources().getColor(R.color.pressed)); 
    } else { 
     setBackgroundColor(getResources().getColor(R.color.black)); 
     if (isChecked) { 
      list1.setTextColor(getResources().getColor(R.color.checked)); 
      desc1.setTextColor(getResources().getColor(R.color.white)); 
     } else { 
      list1.setTextColor(getResources().getColor(R.color.normal)); 
      desc1.setTextColor(getResources().getColor(R.color.lesswhite)); 
     } 
    } 
} 

public boolean isChecked() { 
    return isChecked; 
} 

public void toggle() { 
    setChecked(!isChecked); 
} 
} 

而就是這樣。無需使用selector,也不需要觸摸適配器。爲了使這項工作,在行layout,使用<com.[yourpackage].CheckableLinearLayout,而不是通常的LinearLayout

0

現在你有特殊的要求,它不再是簡單 ,您不能使用SimpleAdapter來達到您所要求的效果。你將不得不延長BaseAdapter並在getView()方法,你可以做到以下幾點:

if (position == 0) { 
    convertView.setBackground(color1); 
} else { 
    convertView.setBackground(color2);   
} 

或者,如果你想要的是一個,您可以使用ListView.addHeaderView()沒有太多的麻煩。

+0

我明白了,這是我失敗的一個很好的理由。我不想要標題,我只是希望列表中的其中一個元素與用戶看起來不同。我甚至可以改變整行的背景或者文字顏色(我可以用一個簡單的適配器來做這件事嗎?)。我嘗試了所有我能想到的(選擇器等),但都失敗了。非常感謝! –

+0

正如我在答案中所說的那樣,這是一個*特殊*要求,用SimpleAdapter不能實現。另外,我認爲僅僅因爲你想堅持'SimpleAdapter'就可以使用某種黑客技術。一個自定義適配器並不複雜**。 – neevek

+0

是的,我明白你的答案。我會考慮並嘗試實施它。謝謝! –

相關問題