java - 使用适配器设置没有 TextView 的 ListView 高度

标签 java android listview adapter android-arrayadapter

我有一个 ListView ,它应该成为一个菜单,每行有两个可绘制对象和两个 TextView 。

Activity 代码:

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高度。我尝试在这里执行此操作:Utils.setListViewHeightBasedOnChildren(listView);,但收到错误:arrayadapter 要求资源 ID 为该行的 textview。有谁知道这个问题的解决方案?

我可以使用其他方法来设置 ListView 高度吗?

谢谢

最佳答案

but getting the error: arrayadapter requires the resource id to be a textview at this row.

R.layout.row 是一个布局文件,它不仅仅有一个 TextView。如果您调用已使用的 super 构造函数,并且还调用了适配器中的 super.getView(在 getView 方法中)方法,则 ArrayAdapter 会提示,因为它期望传递给它的布局文件中有一个小部件(单个 TextView)。

当您确切地知道该行不能是 Textview 的实例时,我不明白为什么在 getView 方法中(使用 super 调用)有这段代码 .

我也不确定如何设置 ListView 的高度,如果您尝试显示 ListView 的所有行,请不要这样做(因为您使 ListView 基本上无用)。如果您仍然想这样做,那么最好放弃 ListView 并手动构建行布局。

关于java - 使用适配器设置没有 TextView 的 ListView 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14396451/

相关文章:

java - 在 Tomcat 上运行时本地/远程调试 GWT 应用程序

Java 1.4 到 Java 1.5 - 重写代码并避免 @SuppressWarnings

android - Android中的心脏信号图

安卓仪器测试 : IllegalAccessError

java - JAVA中使用JNA时内存访问无效

java - Jenkins:\Java\jdk1.8.0_172\jre\bin""这时候没想到

java - Kotlin 代码的 Robolectric 测试用例

listview - 如何在 vb6 的 ListView 中选择一个项目(可能是项目行)?

android - 提高 ListView 从 SD 加载图片到 ListView 时的效率

java - 按钮未显示在自定义 ListView 实现中