【问题标题】:ListView with Custom Adapter with textview and spinner not able to get data带有自定义适配器的 ListView 和 textview 和微调器无法获取数据
【发布时间】:2014-11-17 15:04:35
【问题描述】:

我有一个具有自定义适配器的 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;

}

列表中的文本视图首先从数据库中加载。然后要求用户从微调器中选择评级。用户选择评分后,我需要找到关联的 textView 项目,我不明白如何获取此行数据。请参阅微调器的 onItemSelectedListener() 中的打印语句

非常感谢您帮助解决这个问题。

【问题讨论】:

  • 明确一点:Log.v 为整个列表中的每个微调器一次又一次地打印相同的 textView 项
  • 把这行holder.personSpinner = (Spinner)convertView.findViewById(R.id.spinner2);放到IF中
  • 您的代码中似乎有两个 Spinner,而您说您的 UI 类似于:|文本视图 |文本视图 |文本视图 | Spinner .. 什么是 holder.personSpinner 和 holder.rateSpinner?
  • 一种糟糕的方法是创建一个新类ViewHolder,其中包含您想要的3 个TextViews,并将其设置在您的rateSpinner.setTag(...) 中。在你的监听器中, view.getTag() 应该给你你想要的。
  • 你试过这个解决方案吗?

标签: android android-listview android-spinner android-adapter


【解决方案1】:

当你为你的微调器创建一个适配器时,你传递了一个在你给定的代码中找不到的列表。

难道列表总是相同的,这就是为什么每个微调器都得到相同的项目?

【讨论】:

  • 用户界面如下所示:|文本视图 |文本视图 |文本视图 |微调器。我想在用户设置微调器后获取 3 个文本视图中的值。每个 textView 中都有唯一的文本。代码清楚地打印出选定的微调器项目。但它没有为微调器的 onItemSelectedListener 中的每一行提供正确的 textView 数据
【解决方案2】:

在你的适配器中试试这个

@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;
}

【讨论】:

  • wanz :它在这里抱怨。这应该是 View 还是 LayoutInflater? vi = getContext().getLayoutInflater().inflate(R.layout.todolist_item, null);该错误表明方法 getLayoutInflater() 未定义视图
  • Wanz :适配器用正确的数据行绘制列表视图没有问题。我的问题是如何在微调器的 onClickSelectedItem 侦听器中打印 textView 数据
  • 我正在尝试清理您的代码,然后尝试将 onClickSelectedItem 侦听器放在 else { holder = (ViewHolder) vi.getTag();}
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
相关资源
最近更新 更多