3

現在、テキスト値のリストのみを表示する ListActivity に非常に単純な ListView があります。これが私の現在のコードです:

public class InfoActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> values = new ArrayList<String>();
        // loads up the values array here
        // ...

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
    }

ListActivity を使用しているため、InfoActivity の XML ファイルには何も含まれていません。

私がやりたいことは、行のカスタムレイアウトを作成することです。最初の 5 行には layoutA.xml があり、次の 5 行には layoutB.xml があります。

どうすればいいですか?どこから始めればよいか迷っています。明らかに、私は可能な限り単純なコードを探しています。

4

5 に答える 5

2

これは、リスト アイテムに異なるレイアウトを使用することに関するすばらしいブログ投稿です。

複数の行タイプを持つリストビューの処理

サンプルプロジェクトもあるので、設定してサンプルを試すことができます。

于 2012-08-02T23:04:47.150 に答える
2

これは簡単で、ArrayAdapter を拡張するだけです。私の ArrayAdapter は、次の 2 つのことを異なる方法で行います。

  • 1 つの ResourceId を渡す代わりに、アダプターは ResourceId の配列を受け取ります
  • getView() は位置をチェックし、適切なリソースをロードします

これは簡単な例です。前半が一方向に見えて後半が異なるよりも複雑にすることを計画している場合は、getViewTypeCount()およびgetItemViewType( ) をオーバーライドする必要があります。

作業例:

public class Example extends Activity {
    public class MyArrayAdapter<T> extends ArrayAdapter<T> {
        LayoutInflater mInflater;
        int[] mLayoutResourceIds;

        public MyArrayAdapter(Context context, int[] textViewResourceId, List<T> objects) {
            super(context, textViewResourceId[0], objects);
            mInflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
            mLayoutResourceIds = textViewResourceId;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null && position > 2)
                convertView = mInflater.inflate(mLayoutResourceIds[1], parent, false);
            return super.getView(position, convertView, parent);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] array = new String[] {"one", "two", "three", "four", "five", "six"};
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, array);

        ListView listView = new ListView(this);
        listView.setAdapter(new MyArrayAdapter<String>(this, new int[] {android.R.layout.simple_list_item_1, android.R.layout.simple_list_item_single_choice}, list));
        setContentView(listView);
    }
}
于 2012-08-02T23:05:09.187 に答える
0

リストビューで異なるタイプのビューを表示する必要がある場合は、ビューを切り替える代わりにアダプターで getViewTypeCount() と getItemViewType() を使用することをお勧めします。リストのスクロールに影響します。

アダプターでの getViewTypeCount() および getItemViewType() の使用については、こちらを確認してください。

リンク : getviewtypecount の使用

于 2014-06-30T05:41:57.060 に答える
0

カウンターがある場合、たとえば 0 から開始し、最初の 5 つを で膨らませて再利用し、5 になったらlayoutA.xml、膨らんだものを で廃棄layoutA.xmllayoutB.xmlます。それは十分に簡単なはずです。もちろん、これについては を通じて話しているBaseAdapterので、 の各行を設定するアダプタを作成できますListView。実際に使ったことはありませんListActivity。しかし、プロセスは同じでなければなりません。

@lxx が投稿したリンクを追加するだけで、目的を達成する方法を理解するのに役立ちます。私の意見では、ある種類の5つと別の5つが必要なときにこれらの方法を使用するのはやり過ぎだと思います. そのリンクを適切なベースラインとして使用することは間違いありませんが、カウンターのみを使用してください。その簡単です。メモリの観点から、カウンターが既に 5 つのビューに配置されていることがわかっている場合にのみ、レイアウトを再膨張させます。そうすれば、あなたはいつもそれをしているわけではありません。

于 2012-08-02T22:34:57.723 に答える
0

MergeAdapter (cwac-merge) の使用を試みることができます。1 つの ListView で、レイアウトが異なる複数のアダプタを使用できます。

于 2012-08-02T23:07:32.020 に答える