Установить высоту просмотра списка без TextView с адаптером

У меня есть ListView, который должен стать меню с двумя чертежами и двумя текстовыми представлениями в строке.

Код активности:

ArrayList<MenuItem> itemArray = new ArrayList<MenuItem>();
        itemArray.add(new MenuItem("Headertexxt", "subbtexdt"));
        itemArray.add(new MenuItem("asf", "asf"));

        ListView listView = (ListView) findViewById(R.id.listViewCM);

        String[] array = getResources().getStringArray(R.array.buttonsCM);
        int[] images =  new int[] { R.drawable.btn_car, R.drawable.btn_star, R.drawable.btn_bag};
        listView.setAdapter(new HomeScreenButtonsAdapterSubtext(this, R.layout.row,
                itemArray, images, R.drawable.list_arrow));

        Utils.setListViewHeightBasedOnChildren(listView);
        listView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position) {
                case 0:
                    findViewById(R.id.buttonCreditCompilation).performClick();
                    break;
                case 1:
                    findViewById(R.id.buttonYourCredits).performClick();
                    break;

                }
            }
        });

Код адаптера:

public class HomeScreenButtonsAdapterSubtext extends ArrayAdapter<MenuItem> {

        private Drawable[] drawables;

        private Drawable arrowDrawable;
        private ArrayList<MenuItem> items;

        public HomeScreenButtonsAdapterSubtext(Context context, int resourceId,
                ArrayList<MenuItem> items, int[] images, int arrowImage) {
            super(context, resourceId, items);
            this.items = items;

            Resources resources = context.getResources();
            if (images != null) {
                drawables = new Drawable[images.length];
                int i = 0;
                for (int id : images) {
                    Drawable drawable = resources.getDrawable(id);
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                            drawable.getIntrinsicHeight());
                    drawables[i++] = drawable;
                }
            }

            arrowDrawable = resources.getDrawable(arrowImage);
            arrowDrawable.setBounds(0, 0, arrowDrawable.getIntrinsicWidth(),
                    arrowDrawable.getIntrinsicHeight());
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
             View v = super.getView(position, convertView, parent);
             if (v instanceof TextView) {
             Drawable dr = drawables != null ? drawables[position %
             drawables.length] : null;
             ((TextView) v).setCompoundDrawables(dr, null, arrowDrawable, null);
             Utils.setFont((TextView) v);
             }

//          View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);
            }

            MenuItem station = items.get(position);
            if (station != null) {
                TextView tt = (TextView) v.findViewById(R.id.headerText);
                TextView bt = (TextView) v.findViewById(R.id.subText);


                if (tt != null) {
                    tt.setText(station.getHeaderText());
                }
                if (bt != null) {
                    bt.setText(station.getSubText());
                }

            }

            return v;
        }

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу установить listview height на основе детей. Я пытаюсь сделать это здесь: Utils.setListViewHeightBasedOnChildren(listView);, но получаю ошибку: arrayadapter requires the resource id to be a textview в этой строке. Кто-нибудь знает решение для этого?

Могу ли я использовать какой-либо другой метод для установки высоты ListView?

Спасибо


person PaperThick    schedule 18.01.2013    source источник


Ответы (2)


но получая сообщение об ошибке: arrayadapter требует, чтобы идентификатор ресурса был текстовым представлением в этой строке.

R.layout.row — это файл макета, в котором нет только TextView. Если вы вызываете суперконструктор, который вы использовали, и вы также вызываете метод super.getView (в методе getView) в адаптере, тогда ArrayAdapter будет жаловаться, поскольку он ожидает один виджет в переданном ему файле макета (один TextView).

Я не понимаю, почему у вас есть этот фрагмент кода в методе getView (с супервызовом), когда вы точно знаете, что строка не может быть экземпляром Textview .

Я также не уверен в установке высоты ListView, если вы пытаетесь показать все строки ListView, не делайте этого (поскольку вы сделаете ListView практически бесполезным). Если вы все же хотите это сделать, то лучше сбросить ListView и строить макеты строк вручную.

person user    schedule 18.01.2013
comment
этот ответ работает, но я получил большую помощь от этого и получил большую помощь от этого - person PaperThick; 18.01.2013

На самом деле не имеет смысла устанавливать высоту ListView в зависимости от его содержимого.

Потому что весь смысл ListView состоит в том, чтобы сделать его содержимое прокручиваемым (каким бы большим оно ни было)... поэтому предполагается, что оно имеет фиксированную высоту.

person sdabet    schedule 18.01.2013