【问题标题】:Android ListFragment individually change row background colorAndroid ListFragment 单独改变行背景颜色
【发布时间】:2011-10-21 06:18:31
【问题描述】:

我有一个 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);

我的 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:添加了扩展数组适配器

现在我的问题是,当我只希望某些单独的行是红色或绿色时,每一行都是绿色或红色。此外,没有显示任何文本。

【问题讨论】:

  • 您能否更明确地说明导致NullReferenceException 的原因?这可能有助于确定坠机的原因。并且:它只发生在OUT OF LOCK 行还是IN LOCK 行?
  • 它发生在两个 .setBackgroundResource() 行上
  • holderholder.line 是否解析为 null?
  • 好的,现在我们到了某个地方。这意味着holder.line 是问题的根源。现在,这是从哪里来的: - 当它们被充气时会发生这种情况吗?如果是这样,请发布 line 来自的代码。 - 使用convertView 时会发生这种情况吗?
  • 我添加了找到行的 xml。是的,在使用 convertView 时会发生这种情况。

标签: android list listview background android-fragments


【解决方案1】:

您当前的 getView 实现应该移动到 ListAdapter 实现而不是您的 TrackerFragment 类中。由于您使用的是ArrayAdapter,因此您可以对其进行子类化并将代码放入其中。 ArrayAdapter 已经实现了 getView,但您将覆盖它以提供您的特殊行为。

您收到 NullPointerException 的原因是因为您正在调用 getView 并传入列表视图,该列表视图没有与之关联的标签 - 所以 holder = (ViewHolder) vi.getTag();null 分配给 holder .也就是说,您不应该直接致电getView。系统会在需要显示列表项时为您调用。当系统调用getView 方法时,它最初传入null 以创建视图,而convertView 不是null 的每个调用都是由该方法创建的视图。

【讨论】:

  • 谢谢,我看到了彩色的行,除了现在,它把每一行都染成绿色或红色,而不是显示和文本。我更新了我的帖子
  • 你应该只使用传入的位置,而不是循环遍历数组,即只使用 list[position] 并根据它设置背景和文本。
【解决方案2】:

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

或者你的代码也没有显示任何可以调用它的东西。

【讨论】:

  • getView 方法没有嵌套在类中是什么意思?我该如何解决?
  • 您的代码没有显示任何调用 getView() 方法的内容。它没有被调用,因为你没有在任何地方调用它。试着把它放在你的 activityCreated 方法中。
【解决方案3】:

我越看这个,我就越想知道你使用的基本前提。我认为你把它弄得太复杂了。我会这样做:

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 的最后一个触发器,无论什么。

如果我错过了这一点,请告诉我。但是,我的基本想法是尽可能多地删除复杂性,直到它起作用为止,如果你必须删除一些重要的东西,请慢慢将其重新添加。

【讨论】:

  • 嗯,我有循环遍历列表,片段必须找到我想要背景颜色的行。
  • 但是,就您的代码示例而言,holderlist 之间没有关系。你能更好地解释这种关系吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2015-01-04
相关资源
最近更新 更多