0

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

0 = 白色

1 = 黄色

但它在所有行中都显示为黄色。这是我的自定义适配器:

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>

提前致谢。

4

2 回答 2

1

getView()为列表中的每一行调用,因此您不应遍历其中的所有项目,test而仅处理由 表示的项目,position并且您应该在块之后(而不是在if (convertView == null)块中)执行此操作。

编辑

getView()应该做以下事情:

  • 检查 convertView 是否不为空(如果是,像你一样创建一个新视图)
  • 检查 convertView 是否属于正确的类型(这仅在列表中使用了多种 View 时才重要,此处不是这种情况)。如果类型错误,则创建一个新视图。

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

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

在更复杂的情况下,您可能必须在第二步之前执行第三步,但不是在这里。

于 2013-05-31T17:25:05.940 回答
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); 
  }
  ...
}
于 2013-05-31T19:31:37.403 回答