Как изменить элемент списка в соответствии с одним условием - PullRequest
0 голосов
/ 11 октября 2011

У меня есть список, который использует простой адаптер. В основном каждый элемент состоит из изображения, 1 строкового поля и строки рейтинга.

Макет элемента ListView находится в файле element.xml вместо этого представление списка находится внутри main.xml

Значением строкового поля может быть число, слово FREE или слово INSTALLED.

Просто рядом с этим полем в макете element.xml есть метка с ID = цена и текстовое значение = "цена приложения"

Вот что я получаю сейчас, когда отображаю свой список: «Цена заявки» 4 «Цена заявки» БЕСПЛАТНО «Цена заявки» 7 "Заявочная цена" УСТАНОВЛЕНА «Цена заявки» БЕСПЛАТНО

В основном я хотел бы проверить значение строкового поля и, если оно равно INSTALLEd, метка Цена должна стать невидимой, чтобы получить этот результат:

«Цена заявки» 4 «Цена заявки» БЕСПЛАТНО «Цена заявки» 7 УСТАНОВЛЕНЫ «Цена заявки» БЕСПЛАТНО

Знаете ли вы, как это сделать ...... Я красный, что может быть правильным для расширения метода getview моего простого адаптера, но я не знаю как ..... мне не понятно как работает этот метод и каковы его параметры ..... можете ли вы мне помочь или предложить мне правильную вещь?

public View getView(int position, View convertView, ViewGroup parent) 
    {
        View view = super.getView(position, convertView, parent);


        TextView costo = (TextView) view.findViewById(R.id.costo);
        TextView prezzo = (TextView) view.findViewById(R.id.appPrezzo);
        if (prezzo.getText().equals("Installed"))
        {
            costo.setVisibility(View.INVISIBLE);
            //view = inflater.inflate(R.layout.elem_applist, null);

        }
        else
        {
            costo.setVisibility(View.VISIBLE);
        }

      return view;

Я сделал это таким образом ...... я не знаю, почему я могу комментировать или голосовать за ваш ответ Blessemn ..... в любом случае это работает, но я не использовал инфлятор. ... Надежда верна и без нее:)

Ответы [ 2 ]

1 голос
/ 11 октября 2011

В getview вызывается метод для возврата представления, представляющего каждую строку. Он вызывается несколько раз, даже когда вы прокручиваете список. Аргументы, которые вы получаете

позиция -> номер строки. convertview -> представление, представляющее строку. В начале его ноль. Но однажды оказывается это не будет нулевым. parent -> родительское представление

В методе getview вы ДОЛЖНЫ вернуть представление для представления строки.

Вот как выглядит обычный метод getView

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = mInflater.inflate(R.layout.analytics_row, null);
    TextView mNae = (TextView)convertView.findViewById(R.id.analytic_name);

    if(data.get(position).mystring == ""){
        mNae.setText("YES");
    } else {
        mNae.setText("No");
    }       
    return convertView;
}

Здесь мы просто получаем представление, используя инфлятор, и находим текстовое представление внутри представления. Мы проверяем условие и устанавливаем соответствующий текст и возвращаем представление.

Существуют намного лучшие уроки. Вы должны искать пользовательский базовый адаптер.

Если он работает для вас, то нет проблем с его использованием. Пока вы вернете действительный вид, список будет работать. Inflater просто используется для создания представления из XML-файла.

Но обратите внимание на ответ Пареша. Как видите, он использует статический класс для хранения ссылок на строки внутренних потомков. Когда список отображается впервые, метод getview вызывается только n раз, где n - количество видимых строк в данный момент (не точное). Предположим, что 5 строк видны одновременно, адаптер повторно использует существующее представление и просто обновляет значения в них.

Таким образом, в своем коде он проверяет, что конвертируемое значение равно нулю, если он раздувает новую строку, в противном случае он использует существующую строку с обновленными значениями. Я рекомендую вам посмотреть это видео с Google IO

1 голос
/ 11 октября 2011

Попробуйте приведенный ниже код для определения пользовательского списка. Например:

public static class ViewHolder
    {
        ImageView imgViewLogo;
        TextView txtViewTitle;
        TextView txtViewDescription;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        ViewHolder holder;
        if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.items, null);

            holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
            holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitle);
            holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescription);

            convertView.setTag(holder);
        }
        else
            holder=(ViewHolder)convertView.getTag();

        ItemBean bean = (ItemBean) itemList.get(position);

        holder.imgViewLogo.setImageResource(bean.getImage());
        holder.txtViewTitle.setText(bean.getTitle());
        holder.txtViewDescription.setText(bean.getDescription());

        return convertView;
    }
...