4

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

我的问题是 Spinner 在未按下时在 Activity 上的外观。都是灰色的。没有文字可见。即使在我按下微调器然后从结果列表中选择一个项目后,微调器也不会填充文本。

此外,当我从 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" />
4

4 回答 4

1

为您的微调器使用 Activity 上下文而不是 Application 上下文。请参阅 api 文档getApplicationContext()以了解其正确用法。

将活动上下文传递给MyAdapter并在创建回调TextView中使用它。getView

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;
}
于 2012-05-23T18:47:59.293 回答
1
When I select an item from the Spinner and then print the selected item position, it prints -1

这是因为您引用的是空白列表

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

onPostExecute()在AsynTask中设置微调器适配器。

@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.
                    }
            });
        }
于 2012-05-22T05:17:28.697 回答
0

此代码有效,微调器正确显示该字段,但我必须说它可能不是 100% 完美,由于某种原因我无法将字段的初始值留空,默认情况下它具有项目 0 的值。包 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>
于 2012-05-27T18:08:14.983 回答
0

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

至于文本,请尝试android:prompt在 Spinner xml 中使用属性。对于颜色,我猜它就像其他小部件一样,只需使用android:textColor

于 2012-05-18T19:42:42.613 回答