Android ListView行颜色

时间:2013-05-31 17:21:00

标签: android listview custom-adapter

我正在尝试在customAdapter中更改listView的行颜色。有一个包含0和1的整数数组,我试图从数组中读取并更改行的颜色,如下所示:

0 =白色

1 =黄色

但它在所有行中都显示黄色。 这是我的CustomAdapter:

package com.example.test;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends ArrayAdapter<RowItem> {

ArrayList<Integer> test;

Context context;

public CustomAdapter(Context context, int resourceId, List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}

/* private view holder class */
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);


    SqliteHelper checkFav = new SqliteHelper(context);
    checkFav.open();
    test = checkFav.getFavForList();
    checkFav.close();

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.row_layout, null);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView.findViewById(R.id.pTxt);

        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);


    } else


        holder = (ViewHolder) convertView.getTag();

                    int color0 = Color.YELLOW;
        int colorDefault = Color.WHITE;

        switch (test.get(position)){
        case 0:
            convertView.setBackgroundColor(colorDefault);
            break;
        case 1:
            convertView.setBackgroundColor(color0);
        }       
            holder.txtTitle.setText(rowItem.getTitle());

    holder.imageView.setImageResource(rowItem.getImageId());

    return convertView;
}

}

这是我的row_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:src="@drawable/active_icon" />

    <TextView
        android:id="@+id/pTxt"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textSize="20sp"
        android:gravity="right"/>
</LinearLayout>

提前致谢。

2 个答案:

答案 0 :(得分:1)

为列表中的每一行调用

getView(),因此您不应遍历test中的所有项目,而只应处理由position表示的项目,您应该在({1}}之后执行此操作in)if (convertView == null)块。

修改

getView()应该做以下事情:

  • 检查convertView是否为空(如果是,请按照您的方式创建新视图)
  • 检查convertView是否是正确的类型(这仅在列表中使用多种View时才有意义,这不是这里的情况)。如果类型错误,请创建一个新视图。

现在我们有一个有效的列表行视图。

  • 检索影响如何显示此行的数据。在您的情况下,这将是test.get(position)的结果。 position是请求行的编号(从ListView顶部的0开始)。
  • 根据您的数据调整视图(您在for循环中执行了此操作,但您只应对position处的请求条目执行此操作。)
  • 返回视图

在更复杂的情况下,你可能需要在第二步之前完成第三步,但不是在这里。

答案 1 :(得分:0)

快速解决方案(不是很好的代码,但有效):

@Override
public int getItem(int position){
  return test.get(position);
}


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

  int color0 = ....
  int color1 = ....
  int colorDefault = ...

  switch (test.get(position)) {
     case 0:
             convretview.setBackgroundColor(color0);
             break;
     case 1:
            convretview.setBackgroundColor(color1);
            break;
     default:
           convretview.setBackgroundColor(colorDefault); 
  }
  ...
}