如何使用自定义适配器来使ListPopupWindow正常工作?

5

我想在按钮点击时显示一个简单的字符串数组列表,使用ListPopupWindow来实现。然而,当我进行最小的设置,使用ArrayAdapter<String>或自定义适配器时,当我尝试显示弹出窗口时,会遇到资源未找到异常。这是我正在使用的代码(附带堆栈跟踪)。有什么想法吗?

public class AndroidSandboxActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button btn = (Button)findViewById(R.id.btn1);
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showListPopup(btn);
            }
        });
    }

    public void showListPopup(View anchor) {
        ListPopupWindow popup = new ListPopupWindow(this);
        popup.setAnchorView(anchor);

        ListAdapter adapter = new MyAdapter(this);
        popup.setAdapter(adapter);
        popup.show();
    }

    public static class MyAdapter extends BaseAdapter implements ListAdapter {
        private final String[] list = new String[] {"one","two","three"};
        private Activity activity;
        public MyAdapter(Activity activity) {
            this.activity = activity;
        }

        @Override
        public int getCount() {
            return list.length;
        }

        @Override
        public Object getItem(int position) {
            return list[position];
        }

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

        private static int textid = 1234;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView text = null;
            if (convertView == null) {
                LinearLayout layout = new LinearLayout(activity);
                layout.setOrientation(LinearLayout.HORIZONTAL);

                text = new TextView(activity);
                text.setId(textid);
                layout.addView(text);
                convertView = layout;
            } else {
                text = (TextView)convertView.findViewById(textid);
            }
            text.setText(list[position]);
            return convertView;
        }
    }
}

以下是堆栈跟踪信息(令我困惑的是它显示正在使用一个ArrayAdapter,而我正在使用自定义适配器):

Thread [<1> main] (Suspended (exception Resources$NotFoundException))   
    Resources.loadXmlResourceParser(int, String) line: 2047 
    Resources.getLayout(int) line: 853  
    PhoneLayoutInflater(LayoutInflater).inflate(int, ViewGroup, boolean) line: 389  
    ArrayAdapter.createViewFromResource(int, View, ViewGroup, int) line: 375    
    ArrayAdapter.getView(int, View, ViewGroup) line: 366    
    ListPopupWindow$DropDownListView(AbsListView).obtainView(int, boolean[]) line: 2146 
    ListPopupWindow$DropDownListView.obtainView(int, boolean[]) line: 1156  
    ListPopupWindow$DropDownListView(ListView).measureHeightOfChildren(int, int, int, int, int) line: 1261  
    ListPopupWindow.buildDropDown() line: 1083  
    ListPopupWindow.show() line: 517    
    AndroidSandboxActivity.showListPopup() line: 41 
    AndroidSandboxActivity$1.onClick(View) line: 28 
    Button(View).performClick() line: 3122  
    View$PerformClick.run() line: 11942 
    ViewRoot(Handler).handleCallback(Message) line: 587 
    ViewRoot(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 132 
    ActivityThread.main(String[]) line: 4028    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 491  
    ZygoteInit$MethodAndArgsCaller.run() line: 844  
    ZygoteInit.main(String[]) line: 602 
    NativeStart.main(String[]) line: not available [native method]  

非常感谢您的帮助!

1个回答

5

我找出了ArrayAdapter无法工作的原因;我选择了错误的资源ID用于数组适配器,因为我并没有完全理解ArrayAdapter在列表视图方面的工作原理。使用内置的Android资源:

android.R.layout.simple_dropdown_item_1line

在构建数组适配器时,在相关资源参数中,我能够使东西正常工作。不过,我不确定为什么我的自定义适配器没有起作用,因为上面的代码中我的自定义适配器没有引用任何特定的ID。我提供的堆栈跟踪可能是来自使用 ArrayAdapter 的旧版本代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接