1

私の問題を伝えるために、例を挙げて説明したいと思います

12個の配列があり、それらをList1からList12と呼び、それぞれのサイズが異なるとします。

3つのリストをそれぞれ1つの画面に表示したいので(4つの画面があります)、リスト項目のxmlと、ArrayAdapterを拡張する新しいアダプター(MyAdapter)を作成しました。また、ifステートメントを使用して1つの画面に表示する問題も解決しました。

しかし、これらの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>List2>List3

2つのコンストラクターは、画面間を移動するためのスピナーが画面上にあるからです。

ListIDはスピナーの位置です。

Padma Kumarのソリューションは、これを追加することで機能しました。そして、デフォルトのAdapter for 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;
        }
    }
4

2 に答える 2

1

getcountメソッドを以下のようにハードコーディングしていると思います。

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

渡したリスト内の長さの数が返されます。

空の行が表示されないようにします。

于 2013-02-16T18:36:57.340 に答える
1

あなたの質問を理解できるかどうかはわかりませんが、アダプタで別のリストを使用しようとしている場合はnotifyDataSetChanged、基になるListオブジェクトを変更した後に必ずアダプタを呼び出す必要があります。たとえば、次のコードのようなものをカスタムアダプタに追加します。

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

リストビューに別のリストを表示したいときはいつでも、コードからこれを呼び出すだけです。

mAdapter.swapList(ListX);
于 2013-02-16T18:46:58.627 に答える