许多数组,一个列表视图,一个适配器

时间:2013-02-16 17:24:03

标签: android android-listview android-arrayadapter

告诉我的问题我想解释一个例子

假设我们有12个数组,我们可以将它们称为List1到List12,每个数组都有不同的大小。

我想在一个屏幕上显示每个3个列表 - 我有4个屏幕 - 所以我创建了一个用于列表项的xml和一个扩展ArrayAdapter的新适配器(MyAdapter)。我还解决了使用if语句在一个屏幕上显示它们的问题。

但是这4个屏幕有不同的大小,即使我控制ArrayIndexOutOfBoundsException问题,列表也有空行,因为我写了

MyAdapter<String> adapter = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, R.id.MyListView,
                List1)

我是否必须编写4个适配器

MyAdapter<String> adapter1 = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, R.id.MyListView,
                List1)
MyAdapter<String> adapter2 = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, R.id.MyListView,
                List4)
MyAdapter<String> adapter3 = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, R.id.MyListView,
                List7)
MyAdapter<String> adapter4 = new MyAdapter<String>(this,
                android.R.layout.simple_list_item_1, R.id.MyListView,
                List10)

还是有更简单的解决方案?

感谢您的帮助!

Myadapter课程:

public class MyAdapter<String> extends ArrayAdapter<String> {

        public MyAdapter(Context context, int resource, int textViewResourceId,
                String[] listname) {
            super(context, resource, textViewResourceId, listname);
        }

        public MyAdapter(MainActivity mainActivity, int simpleSpinnerItem,
                String[] listlist) {
            super(mainActivity, simpleSpinnerItem, listlist);
        }



        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View row = inflater.inflate(R.layout.list_item, parent, false);

            TextView tv1 = (TextView) row.findViewById(R.id.textview1);
            TextView tv2 = (TextView) row.findViewById(R.id.textview2);
            TextView tv3 = (TextView) row.findViewById(R.id.textview3);
            if (ListID == 1) {
                tv1.setText(List1[position]);
                if (position < List3.length) {
                    tv2.setText(List2[position]);
                    tv3.setText(List3[position]);
                } else if (position < List2.length) {
                    tv2.setText(List4[position]);
                }
            } else if (ListID == 2) {
                       ...
            }

            else
                tv1.setText(list0[position]);
            return row;
        }
    }

列表长度List1&gt; List2&gt;项目list3

两个构造函数只是因为我在屏幕上有一个微调器进入屏幕之间。

ListID是微调器的位置。

Padma Kumar的解决方案是通过添加这个来解决的。我使用了Spinner的默认适配器,它解决了我的问题。

            @Override
    public int getCount() {
        if (ListID == 1) {
            return List1.length;
        } else if (ListID == 2) {
            return List4.length;
        } else if (ListID == 3) {
            return List7.length;
        } else if (ListID == 4) {
            return List10.length;
        }
    }

2 个答案:

答案 0 :(得分:1)

我认为你正在硬编码你的getcount方法,如下所示。

public int getCount() {
        return list.size();
    }

它将返回列表中您传递的长度数。

这样你就永远不会得到任何空行。

答案 1 :(得分:1)

我不确定我理解您的问题,但是如果您尝试在适配器上使用不同的列表,则应确保在修改基础List对象后在适配器上调用notifyDataSetChanged。例如,将以下代码添加到自定义适配器中。

public void swapList(List<String> list) {
  mList = list;
  this.notifyDataSetChanged();
}

每当您想在列表视图中显示不同的列表时,只需从您的代码中调用它:

mAdapter.swapList(ListX);