Android:带有自定义微调器的自定义适配器下拉 xml 布局给出错误

标签 android spinner layout-inflater custom-adapter

我有一个带有自定义适配器的微调器,用于将微调器下拉列表中第一个元素的高度设置为零。我这样做是为了在我的微调器(第一个元素)中有一条默认消息,而用户无法单击它,因为它是不可见的。

package org.digitalhealthagency.elaj.util;

import java.util.ArrayList;

import org.digitalhealthagency.elaj.gui.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class CustomAdapter extends ArrayAdapter implements SpinnerAdapter{

    Context context;
    int textViewResourceId;
    ArrayList arrayList;

    public CustomAdapter(Context context, int textViewResourceId,  ArrayList arrayList) {
        super(context, textViewResourceId, arrayList);

        this.context = context;
        this.textViewResourceId = textViewResourceId;
        this.arrayList = arrayList;

    }

    @Override
     public View getDropDownView(int position, View convertView, ViewGroup parent){
       if (convertView == null)
       {
         LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         //convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
         convertView = vi.inflate(R.layout.spinner_item, null);
       }

       TextView textView = (TextView) convertView.findViewById(android.R.id.text1);
       textView.setText(arrayList.get(position).toString());//after changing from ArrayList<String> to ArrayList<Object>

       if (position  == 0) { 
          textView.setHeight(0);
      }
      else{
        textView.setHeight(100);
      }

       return convertView;
     }



}

getDropDownView 中,我尝试使用 spinner_item.xml 而不是 android.R.layout.simple_spinner_dropdown_item 进行膨胀。我的 spinner_item 如下所示,

<?xml version="1.0" encoding="utf-8"?>

  <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
    android:gravity="right|center_vertical"
    android:singleLine="true"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingRight="10dp"
    android:ellipsize="marquee" /> 

在我的 Activity 代码中,我按如下方式使用适配器,

        CustomAdapter adapter = new CustomAdapter(this, R.layout.spinner, subSpecialities);
        adapter.setDropDownViewResource(R.layout.spinner_item);
        mSubSpecialtySpinner.setAdapter(adapter);

我的 log cat 中出现以下错误,

07-10 10:49:34.103: E/AndroidRuntime(518): FATAL EXCEPTION: main
07-10 10:49:34.103: E/AndroidRuntime(518): java.lang.NullPointerException
07-10 10:49:34.103: E/AndroidRuntime(518):  at org.digitalhealthagency.elaj.util.CustomAdapter.getDropDownView(CustomAdapter.java:40)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:569)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:565)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.AbsListView.obtainView(AbsListView.java:2033)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.ListView.onMeasure(ListView.java:1155)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-10 10:49:34.103: E/AndroidRuntime(518):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.View.measure(View.java:12723)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.os.Looper.loop(Looper.java:137)
07-10 10:49:34.103: E/AndroidRuntime(518):  at android.app.ActivityThread.main(ActivityThread.java:4424)
07-10 10:49:34.103: E/AndroidRuntime(518):  at java.lang.reflect.Method.invokeNative(Native Method)
07-10 10:49:34.103: E/AndroidRuntime(518):  at java.lang.reflect.Method.invoke(Method.java:511)
07-10 10:49:34.103: E/AndroidRuntime(518):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-10 10:49:34.103: E/AndroidRuntime(518):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-10 10:49:34.103: E/AndroidRuntime(518):  at dalvik.system.NativeStart.main(Native Method)

谁能帮帮我?

最佳答案

textView 为空,因此 NPE..将其更改为 R.id.text1 而不是 android.R.id.text1

TextView textView = (TextView) convertView.findViewById(android.R.id.text1);
                                                        ^^^^^^^^     

关于Android:带有自定义微调器的自定义适配器下拉 xml 布局给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11410028/

相关文章:

java - RecyclerView点击事件不起作用

java - 带 float 的 View 支架

Android: TextView 的最后一行被切断

android - 偶尔的二进制 XML 文件行 #XX : Error inflating class <unknown>

android - 对旧版 Android 浏览器的支持较少(2.* 特定)

android - 如何使 Spinner 的 "disabled"状态看起来已禁用?

Android选择微调项进入警报对话框和文本按钮消失

android - 如何在 Android 中使微调器变灰?

android - 如何将另一个 View 膨胀到 LinearLayout 中?

java - 使用 JSONObjects 动态构建 JSONArray Android