如何让ListPopupWindow使用自定义适配器?

时间:2012-04-03 02:16:05

标签: android listadapter

我想在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 个答案:

答案 0 :(得分:5)

我弄清楚为什么ArrayAdapter不起作用;我为数组适配器选择了不正确的资源ID,因为我并不完全理解ArrayAdapter对列表视图的工作原理。使用这个内置的android资源:

android.R.layout.simple_dropdown_item_1line

在构造数组适配器时的相关资源参数中,我能够让事情发挥作用。我不确定为什么我上面的自定义适配器不起作用,因为我上面的代码中的自定义适配器没有引用任何特定的ID。我提供的堆栈跟踪可能来自使用ArrayAdapter的旧版代码。