在依赖数组适配器的列表视图中以编程方式更改文本颜色

Change textcolor programmatically in listview who depends of arrayadapter

我有下一个结构:

ArrayList<String> arrayList = new ArrayList<>();
list = (ListView) findViewById(R.id.list1);

arrayAdapter = new ArrayAdapter<String>(INGR_NOTAS.this, R.layout.list_item_clickable, R.id.txtitem, arrayList);

list.setAdapter(arrayAdapter);

listview 的布局来自 list_item_clickable.xml 和其中的 textiview "txtitem":

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/txtitem"
        android:textColor="@android:color/white"
        android:background="@android:drawable/editbox_dropdown_dark_frame"
        android:textAlignment="center" />
</LinearLayout>

这个结构在很多 类 中都有效,就像 Textview 所说的那样,文本颜色始终为白色,但现在我需要根据文本的值更改列表视图中的文本颜色(有时白色,有时是红色)。那么,如何添加此更改而不会对整个应用程序的其余代码产生重大影响????

感谢任何建议!!

创建您自己的 extends ArrayAdapter 适配器并覆盖 getView()。没那么复杂。

试试这个:

ArrayList<String> arrayList = new ArrayList<>();
list = (ListView) findViewById(R.id.list1);

arrayAdapter = new ArrayAdapter<String>(INGR_NOTAS.this, R.layout.list_item_clickable, R.id.txtitem, arrayList){
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = super.getView(position, convertView, parent);
        ((TextView)view.findViewById(R.id.txtitem)).setTextColor(position % 2 == 0 ? Color.WHITE : Color.RED); // here can be your logic
        return view;
    };
};

list.setAdapter(arrayAdapter);

希望对您有所帮助

如果基于数组列表项,则使用textView.setTextColor(getResources().getColor(R.id.red);。然后创建一个扩展 ArrayAdapter 的 class,在 getView(,,) 方法中设置颜色。

示例:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item1, null);
                holder = new ViewHolder();
                holder.textView = (TextView)convertView.findViewById(R.id.text);
holder.textView.setTextColor(getResources().getColor(R.id.your_color);
                convertView.setTag(holder);
            } 
            return convertView;
        }

使用 SimpleAdapter 也可以。这是我的解决方案。

List<Map<String, String>> detailsList = debitorRecord.getDetails();

    String[] from = {"created_at","comment","sum"};
    int[] to = {R.id.detailCreatedAt, R.id.detailComment, R.id.detailSum};
    ListAdapter listAdapter = new SimpleAdapter(this, detailsList, R.layout.list_detail_item, from, to)
    {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView textView = (TextView) view.findViewById(R.id.detailSum);
            //Do what u want here, in my case I 
            Map<String, String> currentRow = detailsList.get(position);
            int type = Integer.parseInt(currentRow.get("type"));
            if (DebitorRecord.TYPE_PAYMENT == type) textView.setTextColor(Color.GREEN);
            else textView.setTextColor(Color.RED);

            return view;
        }
    };

    listView.setAdapter(listAdapter);