Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get a ListPopupWindow to work with a custom adapter?

I want to display a simple array of strings in a ListPopupWindow that is shown on a button click. I'm running into problems however, as when I do some minimal setup of either an ArrayAdapter<String> or a custom-built adapter, I run into a resources not found exception when I go to show the popup window. Here is the code I'm using (with the stack trace after it). Any ideas as to what is happening?

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;
        }
    }
}

And here's the stack trace (the thing that boggles my mind is that it says it's using an ArrayAdapter when I'm using my own custom adapter):

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]  

Any help would be appreciated!

like image 894
Kevlar Avatar asked Apr 03 '12 02:04

Kevlar


1 Answers

I figured out why an ArrayAdapter didn't work; I was choosing an incorrect resource id for the array adapter, as I did not entirely understand how ArrayAdapters worked regarding list views. Using this builtin android resource:

android.R.layout.simple_dropdown_item_1line

in the relevant resource argument when constructing the array adapter, I was able to get things to work. I'm not sure exactly why my custom adapter above didn't work, though, as my custom adapter in the code above didn't reference any specific ID. The stack trace I provided was probably from an old version of the code that did use an ArrayAdapter.

like image 199
Kevlar Avatar answered Oct 24 '22 22:10

Kevlar