2012-05-18 46 views
4

我的活动有一个微调。我使用ArrayList和自定义SpinnerAdapter来填充按下Spinner时弹出的列表。微调器看起来不合适

我的问题是当Spinner未按下时,Spinner在活动中查找的方式。全是灰色的。没有文字可见。即使在按下微调框并从结果列表中选择一个项目后,微调框也不会填充文本。

另外,当我从Spinner中选择一个项目,然后打印选定的项目位置时,它会打印-1。许多人评论说,我的微调没有附加数据清单,但显然是。除此之外,我还可以按下Spinner然后从结果列表中进行选择?

 // This sets up the adapter and the arraylist that contains the data 
      private void setUpAdapter() { 
       mData = new ArrayList<MyData>(); 
       mAdapter = new MyAdapter(mData); 
       mSpinner.setAdapter(mAdapter); 

       mSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { 
        public void onItemSelected(AdapterView<?> parent, 
          View view, int pos, long id) { 
          MyData g = (MyData) parent.getItemAtPosition(pos); 
          // TODO 
         } 

         public void onNothingSelected(AdapterView parent) { 
          // Do nothing. 
         } 
       }); 
      } 


    // this populates the arraylist that is attached to the spinner's adapter 
// it is called once an AsyncTask finishes pulling data from a local database 
      private void populateSpinner(ArrayList<MyData> result) { 
       if (result != null) { 
        if (mData == null) { 
         mData = new ArrayList<MyData>(); 
        } 
        else { 
         mData.clear(); 
        } 

        for (int index = 0; index < result.size(); index++) { 
         mData.add(result.get(index)); 
        } 

        mSpinner.setSelected(0); 
       } 
      } 




    // this is the adapter for the spinner 
      private class MyAdapter implements SpinnerAdapter { 

       ArrayList<MyData> data; 

       public MyAdapter(ArrayList<MyData> data){ 
        this.data = data; 
       } 

       @Override 
       public int getCount() { 
        return data.size(); 
       } 

       @Override 
       public Object getItem(int position) { 
        return data.get(position); 
       } 

       @Override 
       public long getItemId(int position) { 
        return position; 
       } 

       @Override 
       public int getItemViewType(int position) { 
        return android.R.layout.simple_spinner_dropdown_item; 
       } 

       @Override 
       public View getView(int position, View convertView, ViewGroup parent) { 
        TextView v = new TextView(getApplicationContext()); 
        v.setTextColor(Color.BLACK); 
        v.setText(data.get(position).getName()); 
        v.setPadding(0, 20, 0, 20); 
        return v; 
       } 

       @Override 
       public int getViewTypeCount() { 
        return 1; 
       } 

       @Override 
       public boolean hasStableIds() { 
        return false; 
       } 

       @Override 
       public boolean isEmpty() { 
        return false; 
       } 

       @Override 
       public void registerDataSetObserver(DataSetObserver observer) { 
        // TODO Auto-generated method stub 
       } 

       @Override 
       public void unregisterDataSetObserver(DataSetObserver observer) { 
        // TODO Auto-generated method stub 
       } 

       @Override 
       public View getDropDownView(int position, View convertView, ViewGroup parent) { 
        return this.getView(position, convertView, parent); 
       } 
      } 


<Spinner 
    android:id="@+id/my_spinner" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 
+0

尝试增加super.getView()到您的getView覆盖 – Codeman

+0

另外补充super.onNothingSelected()到您的适配器(如果可用) – Codeman

回答

0

您可以使用xml属性android:layout_height来设置静态尺寸。 建议使用dp单位而不是px来实现多屏兼容性。

至于文字,请尝试在您的Spinner xml中使用android:prompt属性。对于颜色我猜这就像其他小工具,只要使用android:textColor

+0

微调控件没有'android:textColor'属性... – amp

+0

正如amp所说,Spinner没有textColor属性。我不知道为什么没有文字可见,但它为文字留出空间,因为高度尺寸根据选择的字符串而变化。另外,我知道我可以使用layout_height属性来设置静态高度,但我希望得到类似单线属性的东西。 – Andrew

+0

@amp 你是对的......不幸的是,似乎设置微调文本颜色比看起来更复杂。看到这个: http://stackoverflow.com/questions/6159113/android-where-is-the-spinner-widgets-text-color-attribute-hiding –

2
When I select an item from the Spinner and then print the selected item position, it prints -1 

这是因为你在AsynTask的onPostExecute()引用BLANK列表

mData = new ArrayList<MyData>(); 
mAdapter = new MyAdapter(mData); 
mSpinner.setAdapter(mAdapter); 

设置微调适配器。

@Override 
protected void onPreExecute() { 
     mData = new ArrayList<MyData>(); 
     super.onPreExecute(); 
} 

@Override 
protected Void doInBackground(String... params) { 
     //gets "result" to fill mData 
     return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    setUpAdapter(); 
} 


private void setUpAdapter() { 
    if (result != null) { 
      if (mData == null) { 
       mData = new ArrayList<MyData>(); 
      } 
      else { 
       mData.clear(); 
      } 

      for (int index = 0; index < result.size(); index++) { 
       mData.add(result.get(index)); 
      } 

      mAdapter = new MyAdapter(mData); 
      mSpinner.setAdapter(mAdapter); 
      mSpinner.setSelected(0); 

      mSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { 
       public void onItemSelected(AdapterView<?> parent, 
         View view, int pos, long id) { 
         MyData g = (MyData) parent.getItemAtPosition(pos); 
         // TODO 
        } 

        public void onNothingSelected(AdapterView parent) { 
         // Do nothing. 
        } 
      }); 
     } 
+0

我不知道我是如何引用一个空列表。显然,微调正在填充物品。或者我误解你在说什么?我在很多其他地方用ListView来做这件事。我向适配器中抛出一个空的(但实例化的)ArrayList,然后当我得到它时将数据复制到适配器中。 – Andrew

+0

我将setAdapter调用移动到AsyncTask的post执行中,并且行为没有变化。 – Andrew

+0

'null'我的意思是空白(初始化但没有数据),就像我向你展示的那样执行。 –

1

使用活动上下文代替微调器的应用程序上下文。请参阅getApplicationContext() api的文档以了解其正确用法。

将活动上下文传递给MyAdapter并用它创建TextViewgetView回调。

mAdapter = new MyAdapter(mData, this); // this is activity context. 

在MyAdapter:

public MyAdapter(ArrayList<MyData> data, Context context){ 
    this.data = data; 
    mContext = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView v = new TextView(mContext); 
    v.setTextColor(Color.BLACK); 
    v.setBackgroundColor(Color.WHITE); 
    v.setText(data.get(position).getName()); 
    v.setPadding(0, 20, 0, 20); 
    return v; 
} 
+0

我同意这是一个错误,我已纠正它,但我的问题仍然存在。选择一个项目后,没有文本显示在微调器上,并且调用getSelectedItemPosition仍然返回-1。 – Andrew

+0

尝试设置白色背景颜色到textview .. – Ronnie

+0

你是如何解决它的? – Ronnie

0

此代码工作,微调正确显示领域,但我必须说,也许它不是100%完美,原因出于某种原因IM不能留空该字段的初始值,它默认具有项目0的值。 package com.cccheck;

public class OneCheckActivity extends Activity { 

LayoutInflater factory; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.spinner_view); 
    ArrayList tdata = new ArrayList<MyData>(); 
    MyData mdata =new MyData(); 
    mdata.setName(""); 
    mdata.setData("-1"); 
    MyData ndata =new MyData(); 
    ndata.setName("ciao belluzzo"); 
    ndata.setData("1"); 
    tdata.add(mdata); 
    tdata.add(ndata); 
    mdata= new MyData(); 
    mdata.setName("vai alla fnac"); 
    mdata.setData("2"); 
    tdata.add(mdata); 
    mSpinner = (Spinner) findViewById(R.id.my_spinner); 
    factory = LayoutInflater.from(this); 

    populateSpinner(tdata); 

    setUpAdapter(); 
    mSpinner.setSelected(false); 
    try { 
     mAdapter.notify(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //mAdapter.registerDataSetObserver(new MyObserver()); 
} 
ArrayList<MyData> mData; 
MyAdapter mAdapter = new MyAdapter(null); 
Spinner mSpinner; 
// This sets up the adapter and the arraylist that contains the data 
private void setUpAdapter() { 
    mSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, 
       View view, int pos, long id) { 
       MyData g = (MyData) parent.getItemAtPosition(pos); 
       // TODO 
       Toast.makeText(OneCheckActivity.this , "selected item : " + pos + ", value: " + g.getData(),Toast.LENGTH_LONG).show(); 

      } 
     @Override 
      public void onNothingSelected(AdapterView parent) { 
       // Do nothing. 
      } 

    }); 
} 


    // this populates the arraylist that is attached to the spinner's adapter 
    //it is called once an AsyncTask finishes pulling data from a local database 
private void populateSpinner(ArrayList<MyData> result) { 
    if (result != null) { 
     if (mData == null) { 
      mData = new ArrayList<MyData>(); 
     } 
     else { 
      mData.clear(); 
     } 

     for (int index = 0; index < result.size(); index++) { 
      mData.add(result.get(index)); 
     } 
     mAdapter = new MyAdapter(mData); 

     mSpinner.setAdapter(mAdapter); 
    } 
} 




// this is the adapter for the spinner 
private class MyAdapter implements SpinnerAdapter { 

    ArrayList<MyData> data; 

    public MyAdapter(ArrayList<MyData> data){ 
     this.data = data; 
    } 
    public void updateData(ArrayList<MyData> data){ 
     this.data = data; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
     } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return android.R.layout.simple_spinner_dropdown_item; 
    } 

    @Override 
    public LinearLayout getView(int position, View convertView, ViewGroup parent) { 
     LinearLayout pv = (LinearLayout)(factory.inflate(R.layout.spinner_item, null)); 
     TextView tv = (TextView) pv.findViewById(R.id.textviewid); 
     tv.setTextColor(Color.BLACK); 
     MyData item = data.get(position); 
     tv.setText(item.getName() + " - " + item.getData() + " "); 
     tv.setPadding(0, 20, 0, 20); 
     return pv; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isEmpty() { 
     return data.isEmpty(); 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public LinearLayout getDropDownView(int position, View convertView, ViewGroup parent) { 
     if (convertView instanceof LinearLayout) System.out.println("%%%%%%%%%%%%%%55555 hai ragione"); 
     return this.getView(position, convertView, parent); 
    } 
} 




} 

以此作为布局spinner_item.xml

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
> 

<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:gravity="center" 
android:textSize="28px" 
android:id="@+id/textviewid" 
/> 

</LinearLayout> 
+0

这与hotveryspicy的实现非常相似,它不能解决我的问题。 – Andrew

+0

你有没有试过? – 2012-06-07 23:01:06

+0

如果你超越了你的鼻子,你会发现我耐心地贴出的代码能够解决你的问题,但是你太傲慢了,不能接受它 – 2012-06-11 18:30:43