2013-12-02 4 views
1

Я создаю представление списка, которое содержит (среди нескольких других вещей) 2 ImageViews и TextView. Два ImageViews представляют собой значки «плюс» и «минус», когда они нажимаются, им необходимо обновить номер внутри TextView. Им также необходимо вызвать код, который будет обновлять сумму текстовых элементов под списком ListView.Android OnClickListener для обновления текста внутри той же строки ListView

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 
    if (convertView == null) { 

     holder = new ViewHolder(); 
     convertView = mInflater.inflate(R.layout.basket_item, null); 
     holder.plus = (ImageView) convertView.findViewById(R.id.count_add); 
     holder.minus = (ImageView) convertView.findViewById(R.id.count_minus); 
     holder.counter = (TextView) convertView.findViewById(R.id.text_counter); 
     convertView.setTag(holder); 

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


    holder.id = position; 

    holder.counter.setId(position); 
    holder.counter.setText(count[position]); 


    holder.plus.setId(position); 
    holder.plus.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     int id = v.getId(); 

     if (count[id] < 999) { 
      count[id]++; 
      totalcount++; 
     } 
     } 
    }); 

    holder.minus.setId(position); 
    holder.minus.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
     int id = v.getId(); 

     if (count[id] > 1) { 
      count[id]--; 
      totalCount--; 
     } 
     } 
    }); 

    return convertView; 

    } 
} 

class ViewHolder { 
    ImageView plus; 
    ImageView minus; 
    TextView counter; 
    int id; 
} 

Я считаю, обновлять счетчик в TextView, мне нужно каким-то образом получить свой «держатель» внутри OnClickListner, однако, поскольку он не объявлен как окончательный, я не могу.

Есть ли более простой способ сделать это, или я пропустил трюк здесь?

+0

Вы не меняете текст в текстовом виде напрямую, из-за вида утилизации. что вы делаете, так это то, что вы изменяете базовые данные и запрашиваете обновление представления. – njzk2

ответ

0

Попробуйте реализовать notifyDataSetChanged(), который вызывает getView еще раз. И после этого сделайте недействительным textView. Но я не совсем уверен в необходимости вызова invalidate() здесь.

public void onClick(View v) { 
    int id = v.getId(); 

    if (count[id] > 1) { 
     count[id]--; 
     totalCount--; 
     notifyDataSetChanged(); 
     holder.counter.invalidate(); 
    } 
    } 
}); 
+0

Я еще не пробовал просто добавить notifyDataSetChanged(); (нужно заполнить еще одну часть, чтобы сначала заполнить список). Однако строка holder.counter.invalidate(); ошибки, говорящие: «Переменный держатель» доступен изнутри внутреннего класса. Нужно быть объявленным окончательным ». – MartynX

+0

Да, когда вы объявляете владельца объекта, он должен быть объявлен окончательным - то есть: конечный держатель ViewHolder; Когда вы вызываете notifyDataSetChanged и делаете его окончательным, он должен работать! –

+0

Он делает. Я мог бы поклясться, когда я попытался сделать это окончательно раньше, он сделал ошибку ... Большое спасибо за ваше время! – MartynX

0

Я не уверен в этом. Надеюсь. Попробуйте вставить эту строку в соответствии с методом Onclick.

"holder.counter.setText ('YOUR TEXT totalcount');"

+0

Это то, что я изначально попытался сделать, однако я получаю сообщение об ошибке: «Переменный держатель» доступен изнутри внутреннего класса. Нужно быть объявленным окончательным ». – MartynX

+0

попробуйте сделать это «снова получите представление с помощью метода Onclick, а затем установите для него текст». TextView counter = (TextView) view.findViewById (R.id.text_counter); counter.setText (TotalCount); – saravanakumar

Смежные вопросы