landscape - AutoCompleteTextView OnItemClickListener 空参数(HTC Desire S 上的横向模式)

标签 landscape autocompletetextview onitemclicklistener android

我的问题: 我有一个带有 OnItemClickListener 的 AutoCompleteTextView。这已经运行了 18 个月,但我现在注意到当我在我的 HTC Desire S 上以横向模式选择一个项目时它会抛出一个 NullPointerException。(在纵向模式或我使用过的任何其他手机或模拟器上都没有错误对其进行了测试)。

AdapterView<?> av参数作为空值通过。为什么会这样,我该如何解决?

代码:

myAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.myAutoCompleteTextView);
myAutoCompleteTextView.setSingleLine();

myAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> av, View v, int index, long arg) {
        String selectedItem = (String)av.getItemAtPosition(index);  
        //Do stuff with selected item ...
    }
}

错误:

 java.lang.NullPointerException
    at uk.co.myCompany.mobile.android.myCompanymobile.pages.groups.AbstractGroupSelectionPage$3.onItemClick(AbstractGroupSelectionPage.java:228)
    at android.widget.AutoCompleteTextView.onCommitCompletion(AutoCompleteTextView.java:993)
    at com.android.internal.widget.EditableInputConnection.commitCompletion(EditableInputConnection.java:76)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:368)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:86)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:4385)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
    at dalvik.system.NativeStart.main(Native Method)

额外代码 - 我的自定义适配器内部类:

/**
 * An inner class to simply make a custom adapter in which we can alter the on-screen look of selected groups.
 */
private class SelectedGroupAdapter extends ArrayAdapter<Group> {
    private ArrayList<Group> items;
    private int layout;

    public SelectedGroupAdapter(Context context, int layout, ArrayList<Group> items) {
        super(context, layout, items);
        this.items = items;
        this.layout = layout;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(layout, null);
        }                           
        Group o = items.get(position);

        //Display the group name and number of contacts
        if (o != null) {
            TextView groupName = (TextView) v.findViewById(R.id.groupName);
            TextView noOfContacts = (TextView) v.findViewById(R.id.noOfContacts);
            if (groupName != null) {
                groupName.setText(o.getGroupName());
            }
            if(noOfContacts != null) {
                if (o.isDynamic())
                    noOfContacts.setText(getString(R.string.dynamic));
                else {
                    int contactsCount = o.getGroupSize();
                    if(contactsCount == 1) noOfContacts.setText(contactsCount + " " + getString(R.string.contact));
                    else noOfContacts.setText(contactsCount + " " + getString(R.string.contacts));
                }
            }
        }
        return v;
    }              
}  

最佳答案

我的直觉是,既然你在 list 中声明了 android:configChanges="orientation",那么当你旋转旧的 OnItemClickListener 时,它仍然存在,并且因为你在技术上有一个新的布局,在方向更改之前使用的 AdapterView 不再存在,因此当你点击一个项目时它是空的。

如果是这种情况,我认为有两件事可以解决这个问题:

  1. 删除 list 中的 orientation 选项。您在 configChanges 中放置的任何事件都会告诉 Android“我正在处理此配置更改,所以让我来处理它”,而不是让 Android 处理它。方向发生变化时,Android 的正常操作是销毁并重新创建您的 Activity(它将自动用数据重新填充一些 View)。

  2. 如果您决定需要处理方向更改,则覆盖 onConfigurationChanged() 并将 OnItemClickListener 设置为新的 AdapterView应该在 onCreate 方法中重新创建的对象(ListViewGridView,无论您使用哪个)。

关于landscape - AutoCompleteTextView OnItemClickListener 空参数(HTC Desire S 上的横向模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121337/

相关文章:

ios - 在使用appium时,我们如何将设备方向更改为横向模式?

android - 在 recyclerView Kotlin -android 中实现 onItemClickLitsner

android - 未调用 DrawerLayout 中的自定义 BaseAdapter ListView onItemClickListener

android - 当适配器包含带有 onClickListener 的按钮时,OnItemClickListener 无法正常工作

android - AutoCompleteTextView:在后按时删除软键盘而不是建议

javascript - 如何横向打印网页(firefox IE11)?

iphone - 横向模式下的 tabBarController 和 navigationControllers,第二集

ios - 仅一个屏幕的横向方向模式 - iPhone

android - AutoCompleteTextView 不显示任何下拉项

android - 覆盖android autocompletetextview中的过滤器结果?