Android ListFragment индивидуально меняет цвет фона строки - PullRequest
0 голосов
/ 06 августа 2011

У меня есть ListFragment, где я хочу, чтобы определенные строки были определенного цвета. Я в основном следовал этому: Создание ListView и установка цвета фона представления в каждой строке

Однако 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 ]

1 голос
/ 10 августа 2011

Ваша текущая getView реализация должна быть перемещена в ListAdapter реализацию вместо вашего TrackerFragment класса.Поскольку вы используете ArrayAdapter, вы можете создать его подкласс и поместить туда код.ArrayAdapter уже реализует getView, но вы переопределите его для обеспечения своего специализированного поведения.

Причина, по которой вы получаете исключение NullPointerException, заключается в том, что вы вызываете getView и передаете представление списка, с которым не связан тег, поэтому holder = (ViewHolder) vi.getTag(); назначает null на holder.Тем не менее, вы не должны звонить getView напрямую.Система будет вызывать это для вас всякий раз, когда нужно отобразить элемент списка.Когда система вызывает метод getView, она сначала передает null для создания представлений, и каждый вызов, где convertView не null, является представлением, созданным этим методом.

0 голосов
/ 09 августа 2011

Чем больше я смотрю на это, тем больше меня интересует основная предпосылка, которую вы используете. Я думаю, ты делаешь это слишком сложным. Я бы сделал это так:

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, неважно что.

Если я упустил суть в этом, дайте мне знать. Но моя основная мысль состояла в том, чтобы убрать как можно больше сложности, пока она не заработает, и, если вам пришлось удалить что-то важное, медленно добавьте ее обратно.

0 голосов
/ 06 августа 2011

Похоже на ту же проблему, что и сообщение, которое вы связали: метод getView () не вложен в класс.

Или ваш код не показывает ничего, что могло бы вызвать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...