Как мне заставить ListPopupWindow работать с пользовательским адаптером? - PullRequest
4 голосов
/ 03 апреля 2012

Я хочу отобразить простой массив строк в 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 голосов
/ 04 апреля 2012

Я понял, почему ArrayAdapter не работает;Я выбирал неверный идентификатор ресурса для адаптера массива, так как я не совсем понимал, как ArrayAdapter работает с представлениями списка.Используя этот встроенный ресурс Android:

android.R.layout.simple_dropdown_item_1line

в соответствующем аргументе ресурса при создании адаптера массива, я смог заставить все работать.Я точно не знаю, почему мой пользовательский адаптер выше не работал, так как мой пользовательский адаптер в приведенном выше коде не ссылался ни на какой конкретный идентификатор.Трассировка стека, которую я предоставил, была, вероятно, от старой версии кода, которая использовала ArrayAdapter.

...