您好,我正在尝试更改 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/