Android ListFragment单独更改行背景颜色

时间:2011-08-05 22:52:52

标签: android list listview background android-fragments

我有一个ListFragment,我希望某些行是某种颜色。我基本上遵循了这个:Creating a ListView and setting the background color of a view in each row

但是,从不调用getView。有谁知道为什么?

    public class TrackerFragment extends ListFragment
{   
    private String[] list;
    @Override
    public void onActivityCreated(Bundle myBundle)
    {
        super.onActivityCreated(myBundle);

        list = null;
        ListView lv = getListView();
        setListAdapter(null);
        setEmptyText("Touch a connection to view tracker information.");
        lv.setTextFilterEnabled(true);
    }

    public void updateList(String[] list)
    {
        this.list = list;
        setListAdapter(new ColoredArrayAdapter(getActivity(),R.layout.list_item,list));
    }
}

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="7dp"
    android:textSize="14sp" 
    android:id="@+id/line">
</TextView>

我正在从我的活动中更新这样的列表:

TrackerFragment tf = (TrackerFragment) fragmentManager.findFragmentById(R.id.tracker1);
tf.updateList(result);

My ColoredArrayAdapter

public class ColoredArrayAdapter extends ArrayAdapter{

    private String[] list;

    public ColoredArrayAdapter(Context context, int textViewResourceId,
            Object[] objects) {
        super(context, textViewResourceId, objects);
        list = new String[objects.length];
        for (int i = 0; i < list.length; i++)
            list[i] = (String) objects[i];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
{
    View vi = convertView;
    ViewHolder holder;

    if (convertView == null)
    {
        vi = LayoutInflater.from(getContext()).inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.line = (TextView) vi.findViewById(R.id.line);
        vi.setTag(holder);
    }
    else
        holder = (ViewHolder) vi.getTag();

    for (int i = 0; i < list.length; i++)
    {
        if (list[i].contains("OUT OF LOCK"))
        {
            System.out.println("OUT OF LOCK");
            holder.line.setText(list[i]);
            //holder.line.setTextColor(R.color.white);
            holder.line.setBackgroundResource(R.color.red);
        }
        else if(list[i].contains("IN LOCK"))
        {
            System.out.println("In LOCK");
            holder.line.setText(list[i]);
            //holder.line.setTextColor(R.color.white);
            holder.line.setBackgroundResource(R.color.green);
        }
        else
            holder.line.setText(list[i]);
    }

    return vi;
}
}

我做错了什么? 编辑:添加了list_item.xml,其中找到了行。 Edit2:添加了扩展数组适配器

现在我的问题是,当我只想要某些单独的行为红色或绿色时,每一行都是绿色或红色。此外,没有任何文字出现。

3 个答案:

答案 0 :(得分:1)

您当前的getView实施应移至ListAdapter实施,而不是TrackerFragment课程。由于您正在使用ArrayAdapter,因此您可以将其子类化并将代码放在那里。 ArrayAdapter已经实现getView,但您将覆盖它以提供您的专业行为。

您获得NullPointerException的原因是因为您正在调用getView并传入列表视图,该视图中没有与之关联的标记 - 因此holder = (ViewHolder) vi.getTag();指定{{1}到null。也就是说,你不应该直接打电话给holder。只要需要显示列表项,系统就会为您调用。当系统调用getView方法时,它最初会传入getView以创建视图,而null不是convertView的每个调用都是由该方法创建的视图

答案 1 :(得分:0)

看起来与您链接的帖子相同的问题:getView()方法没有嵌套在类中。

或者您的代码没有显示任何可以调用它的内容。

答案 2 :(得分:0)

我越看越清楚,我就越想知道你使用的基本前提。我认为你让它变得过于复杂。我会这样做:

public View getView(View convertView)
{
    View vi = convertView;
    TextView viText = null;

    if (vi == null)
        vi = LayoutInflater.from(getActivity()).inflate(R.layout.list_item, null);
    viText = (TextView)vi.findViewById(R.id.line);

    if (viText == null) return vi;
    String viString = viText.getText().toString();

    if (viString.contains("OUT OF LOCK"))
    {
        viText.setBackgroundResource(R.color.red);
    }
    else if (viString.contains("IN LOCK"))
    {
        viText.setBackgroundResource(R.color.green);
    }

    return vi;
}

我认为你没有按照你想象的方式使用holder ...你在那里的循环只会循环设置后台资源到设置backgroundResource的最后一个触发器,无论如何。

如果我错过了这一点,请告诉我。但是,我的基本想法是尽可能地消除复杂性,直到它工作,如果你不得不删除重要的东西,慢慢地将它重新加入。