使用SimpleCursorAdapter和ViewBinder的Spinner项目单击侦听器的方法

时间:2011-11-06 21:11:41

标签: android android-layout spinner android-viewbinder

我有一个Spinner元素,我使用Cursor填充SimpleCursorAdapter的数据。另外,我使用setViewBinder作为Spinner的自定义行布局。一切正常,Spinner获取数据,Spinner项使用自定义布局。

但点击Spinner下拉视图中的项目无效。它不会将所选项目设置为选中,也不会关闭下拉视图。我不知道我要做什么,所以列表中的选定项目将传递给Spinner逻辑,并按照应有的方式运行。这是我正在使用的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:baselineAligned="false"
    android:clickable="true"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:src="@drawable/ic_launcher" />


    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="6dp"
        android:layout_weight="1"
        android:textColor="#424242"
        android:gravity="center_vertical"
        android:text="Textfield" />

</LinearLayout>
</LinearLayout>

这是ViewBinder

static final ViewBinder VIEW_BINDER = new ViewBinder(){
    public boolean setViewValue(View view, Cursor cursor, int columnIndex){

        if (view.getId() == R.id.text){

            String local = view.getResources().getString(cursor.getInt(columnIndex));
            ((TextView) view).setText( local );

            return true;
        }
        if (view.getId() == R.id.icon){

            int icon = cursor.getInt(columnIndex);
            ((ImageView) view).setImageResource(icon);

            return true;
        }

        return false;
    }
};

以下是我如何将数据添加到Spinner

private Spinner spinner;
private DBHandler dbhandler;
private SimpleCursorAdapter adapter;
private final String[] from = new String[]{dbhandler.LIB_LOCAL, dbhandler.LIB_ICON};
private final int[] to = { R.id.text, R.id.icon };  
@Override
protected void onResume(){
    super.onResume();

    Cursor cursor = dbhandler.getLibEntries();


    adapter = new SimpleCursorAdapter(this, R.layout.spinner_row, cursor, from, to);
    adapter.setViewBinder(VIEW_BINDER);
    spinner.setAdapter(adapter);
}

在这篇文章中添加OnItemSelectedListener之类的建议如下所示,但没有解决问题。此外,我不确定setOnItemSelectedListener如何帮助我获取以后需要的数据字段:

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // TODO Auto-generated method stub

        }

        });

the problem

2 个答案:

答案 0 :(得分:0)

您应该做的是实施OnItemSelectedListener。在监听器中,当选择一个项目时,将该项目保存到某种变量,您可以在微调器关闭后访问它。

答案 1 :(得分:0)

我们走了:

设置adapter.setDropDownViewResource(R.layout.spinner_row);的必要性 DropDownView定义DropDownView的外观,SimpleCursorAdapter构造函数中定义的布局定义(闭合)微调器对象本身的项目布局(而不是其下拉视图!)。

所以,对于DropDownView有一个不同的布局很好,它与SimpleCursorAdapter中定义的布局非常相似,因此推送到它的值可以设置为正确的相应字段,除了我使用{{1}的差异对于dropdownview布局的textview和android:layout_height =&#34; wrap_content&#34;用于微调器布局的textview!