我可以使一个ListView项具有不同的文本颜色吗?

时间:2011-06-16 18:04:50

标签: android listview

我有布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView
    android:id="@+id/ListView01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1.0"
    android:textColor="@android:color/white"
    android:dividerHeight="1px"
    android:listSelector="@drawable/highlight_sel"
    />
</LinearLayout>

代码:

private ListView lv1;
private String lv_arr[]={"Item 1","Item 2","Item 3","Item 4"};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newsmenu);

    lv1=(ListView)findViewById(R.id.ListView01);
    // By using setAdpater method in listview we an add string array in list.
    lv1.setAdapter(
       new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1,
                                lv_arr));
}

我希望第2项(或1或3或4)的文本颜色动态显示为红色(表示新项目)或白色(默认)。有没有办法做到这一点?

我已经有一个选择器,这就是我使用ListView的原因。我搜索了互联网和这个网站,我没有看到这个问题。

有可能吗?

3 个答案:

答案 0 :(得分:3)

是的,一切皆有可能。您需要编写自己的适配器实现,基本上覆盖适配器中的getView方法。搜索谷歌和堆栈,你会发现很多关于如何编写适配器的教程。

答案 1 :(得分:2)

编写一个特殊的适配器来覆盖简单适配器中的getView是在列表视图中在您选择的行上交替更改文本颜色的方法。我在这个网站上采用了多次重复的例子,并添加了一种改变文本颜色的方法。选择颜色位置的位置模式长度可以替换为您喜欢的任何方案。文本视图“business”可以是我的布局的第一行 - 或者使用android.R.id.text1。

public class SpecialAdapter extends SimpleAdapter {
private int[] colors = new int[] { 0x30FF0000, 0x300000FF };

public SpecialAdapter(Context context, List<HashMap<String, String>> items, int resource, String[] from, int[] to) {
    super(context, items, resource, from, to);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view = super.getView(position, convertView, parent);
  int colorPos = position % colors.length;
  //view.setBackgroundColor(colors[colorPos]); //old example
  TextView tv1 = (TextView)view.findViewById(R.id.business); //new
  tv1.setTextColor(colors[colorPos]); //new
  return view;
}
}

只需在您的应用中使用SpecialAdapter而不是SimpleAdapter。

答案 2 :(得分:0)

这是一个getView方法的示例。请注意,它使用了一个视图来提高效率。如果您想了解更多相关信息,请与我联系。

public View getView(int position, View convertView, ViewGroup parent) {

    tempDeal = exampleBoxArrayList.get(position);

    ViewHolder holder;

    if (convertView == null) {
        convertView = inflator.inflate(R.layout.list_item_example_box, null);
        holder = new ViewHolder();
        holder.divider = (RelativeLayout) convertView.findViewById(R.id.example_box_divider);
        holder.merchantName = (TextView) convertView.findViewById(R.id.example_box_merchant_name);
        holder.expireDate = (TextView) convertView.findViewById(R.id.example_box_expire_date);
        holder.description = (TextView) convertView.findViewById(R.id.example_box_description);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();

    }

    if (tempDeal.isDivider()) {
        holder.divider.setVisibility(View.VISIBLE);
    } else {
        holder.divider.setVisibility(View.GONE);
    }

    holder.merchantName.setText(tempDeal.getMerchantName());
    holder.expireDate.setText(tempDeal.getExpiryDateString());
    holder.description.setText(tempDeal.getPriceOption().getDescription());

    return convertView;

}

如您所见,我在自定义对象上调用isDivider()方法(此方法在数据加载时查看布尔值集)。此方法用于打开或关闭部分布局的可见性。

或者,您可以基于同样的概念加载全新的布局。