ListView с пользовательским адаптером с текстовым представлением и счетчиком не может получить данные

У меня есть ListView с настраиваемым адаптером. Каждая строка в списке имеет 3 текстовых поля и счетчик. Мне нужно получить связанные данные в текстовом представлении, как только пользователь выберет элемент счетчика. Итак, представьте себе listView следующим образом: |texView|textView|textView|Spinner| Выбрав что-то в столбце счетчика, мне нужно получить 3 данных textview. Но я не могу этого добиться.

Я схожу с ума о том, как заставить это работать. Вот код CustomAdapter:

private class ViewHolder {

   Spinner rateSpinner;
   TextView pView;
   TextView nView;
   TextView cView;

 }


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

 ViewHolder holder = null;


 if (convertView == null) {
    LayoutInflater vi =       
          (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = vi.inflate(R.layout.todolist_item, null);

    holder = new ViewHolder();
    holder.pView = (TextView)convertView.findViewById(R.id.r1);
    holder.nView = (TextView)convertView.findViewById(R.id.r2);
    holder.cView = (TextView)convertView.findViewById(R.id.r3); 
    holder.rateSpinner = (Spinner)convertView.findViewById(R.id.spinner2);


    convertView.setTag(holder);

    holder.rateSpinner.setOnItemSelectedListener(
       new AdapterView.OnItemSelectedListener() {
           @Override
           public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
               Object item = parent.getItemAtPosition(pos);


               selectedRating = item.toString();

               Log.v("Chosen rating from spinner", selectedRating); //<-this works correctly

               Log.v("**********************","**");// <------- Problem: Need to get list view's textview entries with the associated spinner. But its just not working. Always printing the same wrong textview data

               Log.v("Order Name",item._nText);
               Log.v("Order Count",item._cText);
               Log.v("Order Price",item._pText);

               Log.v("**********************","**");

           }
           @Override
           public void onNothingSelected(AdapterView<?> parent) {

           }
       }
   );


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

  holder.rateSpinner = (Spinner)convertView.findViewById(R.id.spinner2);
  ArrayAdapter<String> adapter = new ArrayAdapter<String>(c, 
                    android.R.layout.simple_spinner_item, list);
  holder.rateSpinner.setAdapter(adapter);
  fItem item = getItem(position);



  holder.pView.setText(item._pText);
  holder.nView.setText(item._nText);
  holder.cView.setText(item._cText);


  return convertView;

}

TextViews в списке загружаются первыми из базы данных. А затем пользователю предлагается выбрать оценки из спиннера. После того, как пользователь выбирает рейтинг, мне нужно найти связанные элементы textView, и я не понимаю, как получить данные этой строки. См. Оператор печати в onItemSelectedListener() счетчика.

Был бы очень признателен за вашу помощь, чтобы понять это.


person user2511030    schedule 17.11.2014    source источник
comment
Для ясности: Log.v снова и снова печатает один и тот же элемент textView для каждого счетчика во всем списке.   -  person user2511030    schedule 17.11.2014
comment
поместите эту строку holder.personSpinner = (Spinner)convertView.findViewById(R.id.spinner2); в ЕСЛИ   -  person SweetWisher ツ    schedule 17.11.2014
comment
в вашем коде кажется два Spinner, в то время как вы говорите, что у вас есть пользовательский интерфейс, например: | текстовый вид | текстовый вид | текстовый вид | Spinner .. что такоеholder.personSpinner иholder.rateSpinner?   -  person SweetWisher ツ    schedule 17.11.2014
comment
Извините, опечатка. Я починил это. У меня уже есть очередь. Есть только один спиннер. скоростьSpinner. Я пытался сделать имена переменных более значимыми перед публикацией.   -  person user2511030    schedule 17.11.2014
comment
Я даже пытался распечатать данные textview за пределами кода пользовательского адаптера. Позвольте мне опубликовать это.   -  person user2511030    schedule 17.11.2014
comment
Дерьмовым способом будет создать новый класс ViewHolder с 3 TextViews, которые вы хотите, и установить его в свой rateSpinner.setTag(...). В вашем слушателе view.getTag() должен дать вам то, что вы хотите.   -  person Groco    schedule 17.11.2014
comment
Гроко, ты можешь показать мне дорогу, даже если это паршиво. Что я должен указать в setTag?   -  person user2511030    schedule 17.11.2014
comment
Вы ставите просмотры, которые вы хотите. Чтобы иметь 3 представления, создайте новый держатель, управляющий 3 представлениями. Затемholder.rateSpinner.setTag(myCrappyHolder)   -  person Groco    schedule 17.11.2014
comment
Вы пробовали это решение?   -  person Groco    schedule 17.11.2014
comment
Хорошо, Groco сработало так:holder.rateSpinner.setTag(item); а затем в onItemSelected я делаю: fw = (fItem) parent.getTag(); Я знаю, что не рекомендуется передавать данные через теги, но я не знаю, как еще это сделать.   -  person user2511030    schedule 17.11.2014
comment
Спасибо, что поняли мою проблему и сделали предложение, которое помогло мне. Пожалуйста, дайте мне знать, если вы считаете, что это плохое решение. Мой список может быть очень длинным. Это будет сосать.   -  person user2511030    schedule 17.11.2014


Ответы (2)


Когда вы создаете адаптер для своего счетчика, вы передаете список, которого нигде нет в вашем коде.

Может быть, список всегда один и тот же, поэтому вы получаете одни и те же предметы для каждого спиннера?

person Simas    schedule 17.11.2014
comment
Пользовательский интерфейс выглядит следующим образом: | текстовый вид | текстовый вид | текстовый вид | Спиннер. Я хочу получить значения в трех текстовых представлениях после того, как пользователь установит счетчик. Каждый textView содержит уникальный текст. Код четко распечатывает выбранные элементы счетчика. Но это не дает мне правильных данных textView для каждой строки внутри счетчика onItemSelectedListener. - person user2511030; 17.11.2014

просто попробуйте это в своем адаптере

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

if (vi == null) {
    vi = getContext().getLayoutInflater().inflate(R.layout.todolist_item, null);
    holder.pView = (TextView)vi.findViewById(R.id.r1);
    holder.nView = (TextView)vi.findViewById(R.id.r2);
    holder.cView = (TextView)vi.findViewById(R.id.r3); 
    holder.rateSpinner = (Spinner)vi.findViewById(R.id.spinner2);
    holder.personSpinner = (Spinner)vi.findViewById(R.id.spinner2); 
    vi.setTag(holder);
}
else {
    holder = (ViewHolder) vi.getTag();
}

ArrayAdapter<String> adapter = new ArrayAdapter<String>(c, 
                android.R.layout.simple_spinner_item, list);
holder.rateSpinner.setAdapter(adapter);
fItem item = getItem(position);

holder.pView.setText(item._pText);
holder.nView.setText(item._nText);
holder.cView.setText(item._cText);

return vi;
}
person wanz    schedule 17.11.2014
comment
wanz: Здесь жалуются. Должен ли это быть View или LayoutInflater? vi = getContext().getLayoutInflater().inflate(R.layout.todolist_item, null); Ошибка говорит, что метод getLayoutInflater() не определен для представления. - person user2511030; 17.11.2014
comment
Ванц: Нет проблем с тем, что адаптер закрашивает представление списка строками правильных данных. Моя проблема заключается в том, как распечатать данные textView внутри прослушивателя onClickSelectedItem счетчика. - person user2511030; 17.11.2014
comment
я пытаюсь очистить ваш код и просто попробовать поместить прослушиватель onClickSelectedItem после else {holder = (ViewHolder) vi.getTag();} - person wanz; 18.11.2014