java - ListView 更改文本中的文本颜色

标签 java android listview colors

您好,我正在尝试更改 ListView 单元格中的文本颜色,但我做不到,因为我得到了

11-25 20:22:37.176: E/AndroidRuntime(1338): FATAL EXCEPTION: Thread-116
11-25 20:22:37.176: E/AndroidRuntime(1338): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
11-25 20:22:37.176: E/AndroidRuntime(1338):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
11-25 20:22:37.176: E/AndroidRuntime(1338):     at java.util.ArrayList.get(ArrayList.java:304)
11-25 20:22:37.176: E/AndroidRuntime(1338):     at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:225)
11-25 20:22:37.176: E/AndroidRuntime(1338):     at morisson.Notowaniagieldowe.Tab2Fragment.getViewByPosition(Tab2Fragment.java:254)
11-25 20:22:37.176: E/AndroidRuntime(1338):     at morisson.Notowaniagieldowe.Tab2Fragment$1.run(Tab2Fragment.java:123)

这是我尝试更改颜色的部分代码:

    int k = cash.size();
                    if(k>0){

                        for(int l=0;l<k;l++){
                            LinearLayout root = (LinearLayout) getViewByPosition(l+1,listView);
                            if(price<m)
                            {
                                ((TextView) root.findViewById(R.id.amount)).setTextColor(Color.RED);
}
}
}

当我创建线性布局时,我必须递增 l+1,因为如果我从零开始,我会在标题处更改颜色。这是我用来更改返回 View 的方法:

public View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

更新: 这是我的适配器。我要补充一点,当我的应用程序启动时,列表是空的,但更新颜色的新线程正在运行。

public ListViewAdapter(Activity activity,ArrayList<HashMap<String, String>> list){
    super(activity, R.layout.lista_wlasnych_spolek, list);
    this.activity=activity;
    this.list=list;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
}

@Override
public HashMap<String, String> getItem(int position) {
    // TODO Auto-generated method stub
    return list.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}



private int mColor = Color.BLACK;

public void setColor(int color)
{
    mColor = color;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListViewHolder listViewHolder;
if(convertView == null){
    listViewHolder = new ListViewHolder();
    convertView = activity.getLayoutInflater().inflate(R.layout.lista_wlasnych_spolek, null);
    listViewHolder.txtFirst = (TextView) convertView.findViewById(R.id.nazwa_spolki);
    listViewHolder.txtSecond = (TextView) convertView.findViewById(R.id.wartosc_akt);
    listViewHolder.txtThird = (TextView) convertView.findViewById(R.id.wartosc_kupna);
    listViewHolder.txtFourth = (TextView) convertView.findViewById(R.id.wartosc_calosci);
    convertView.setTag(listViewHolder);
} else {
    listViewHolder = (ListViewHolder) convertView.getTag();
}

HashMap<String, String> map=list.get(position);
listViewHolder.txtFirst.setText(map.get(FIRST_COLUMN));
listViewHolder.txtSecond.setText(map.get(SECOND_COLUMN));
listViewHolder.txtThird.setText(map.get(THIRD_COLUMN));
listViewHolder.txtFourth.setText(map.get(FOURTH_COLUMN));


TextView textViewFirst = (TextView) convertView.findViewById(R.id.nazwa_spolki);
TextView textViewSecond = (TextView) convertView.findViewById(R.id.wartosc_akt);
TextView textViewThird = (TextView) convertView.findViewById(R.id.wartosc_kupna);
TextView textViewFourth = (TextView) convertView.findViewById(R.id.wartosc_calosci);

textViewFirst.setTextColor(mColor);
textViewSecond.setTextColor(mColor);
textViewThird.setTextColor(mColor);
textViewFourth.setTextColor(mColor);

return convertView;
}

public class ListViewHolder {
    TextView txtFirst;
    TextView txtSecond;
    TextView txtThird;
    TextView txtFourth;
}

最佳答案

您不应在适配器外部管理 View ,因为您无法控制 ListView 何时绘制 View 或每个 View 是否可见。

您应该在适配器中设置颜色并调用 notifyDataSetChanged 以通知 ListView 重绘 View (为每个可见项调用 getView)。

基本上您已经使用适配器的变量 mColor 完成了它,您只需要在颜色更改后添加对 notifyDataSetChanged 的​​调用以通知 ListView 重绘 View 。

关于java - ListView 更改文本中的文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926343/

相关文章:

java - Graphics.drawImage 将 BufferedImage 留空

android - 新手字符串错误

java - 尝试在 ListView 中更新从 SQLite 检索到的值时应用程序崩溃

android Howto "really"获取sd卡文件mime类型

android - 如何在 Jetpack Compose 中添加工具栏?

android - 为什么我的 Android 应用程序一直告诉我我需要定义一个已经定义的 ListView id?

java - 从 ListView 及其文本文件中删除一行

java - getStacktrace(),setStackTrace()有什么用?我无法理解这个函数的需要是什么?

java - JPA:自己的注释来为具有相同值的字段捆绑注释

java - 为什么这个初学者java程序有错误