2011-01-10 16 views
0

私はListViewScrollViewの中に入れたかった悪いnoobのひとりです。Googleのメンタリティ:ListView in ScrollView

ここでは、ネストされたスクロール可能な要素が欲しくないことを理解しています。デザインに同意できないとは思いますが、わかります。私が理解できないのは、スクロール不可能なものをListViewにして別のScrollable要素にネストすることができない理由です。

listView.setScrollContainer(false)(私はListViewのスクロール可能性をオフにすることができると思っていたので)解決策のようでしたが、運はありません。

誰かがGoogleがリストビューをスクロールさせない理由を説明することができます - このnumptyが気にしないことを行う方法はありますか?

+0

Googleの考え方であれば、なぜAndroidを学びたいのですか? –

答えて

2

Mayra氏のように、UIを再考する必要があります。

複数のリストビューを持たない限り、私はあなたの問題の解決策を見ることができます。スクロールビューにはリストビューが1つしかないようです。つまり、上または下に何かを配置したかったということです。

あなたはsetHeader、setFooterを持っています。あなたが望むものを置くだけです。これらのビューをsetAdapter()の前に追加する必要があります。

スクロールビューに複数のリストビューがある場合。私には2番目の解決策があります。私は本当に詳しく説明することはできません。しかし、カスタムアダプターを作成してViewTypeCountをオーバーライドして、複数のタイプのアイテムを処理できるようにする必要があります。そうすれば、アダプターを通して必要なものすべてをロードできます。そして本当に必要なのはListViewだけです。あなたは、アダプタをサブクラス化し、getViewメソッドをオーバーライドする必要が

あなたがここに項目の複数のタイプ(複数のリストビュー)を処理したい場合は、「未テスト」の例である

。慣習的には、ビューのリサイクルに似たものを用意する必要があります。

if(view == null){ 
    //inflate view 
} 

あなたのケースでは、それを行う必要があります。

package com.neutrino.lvt; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class Main extends Activity { 
    private ListView lv; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     lv = (ListView)findViewById(R.id.lv); 

     ArrayList<Items> items = new ArrayList<Items>(); 

     items.add(new ItemA("Une")); 
     items.add(new ItemA("Une3")); 
     items.add(new ItemA("Une4")); 
     items.add(new ItemA("Une5")); 
     items.add(new ItemA("Une6")); 
     items.add(new ItemA("Une7")); 
     items.add(new ItemA("Une8")); 
     items.add(new ItemA("Une9")); 
     items.add(new ItemA("Une0")); 
     items.add(new ItemA("Une0-")); 
     items.add(new ItemB("bbb", "cc1c")); 
     items.add(new ItemB("bbb3", "c2cc")); 
     items.add(new ItemB("bbb4", "c2cc")); 
     items.add(new ItemB("bbb5", "c1cc")); 
     items.add(new ItemB("bbb6", "cc5c")); 
     items.add(new ItemB("bbb7", "cc4c")); 
     items.add(new ItemB("bbb7", "c2cc")); 
     items.add(new ItemB("bbb8", "c1cc")); 
     items.add(new ItemB("bbb9", "cc6c")); 
     items.add(new ItemB("bbb0", "cc8c")); 
     items.add(new ItemB("bbb0", "cc0c")); 
     items.add(new ItemB("bb3b", "cc6c")); 
     items.add(new ItemA("Une")); 
     items.add(new ItemA("Une3")); 
     items.add(new ItemA("Une4")); 
     items.add(new ItemA("Une5")); 
     items.add(new ItemA("Une6")); 
     items.add(new ItemA("Une7")); 
     items.add(new ItemA("Une8")); 
     items.add(new ItemA("Une9")); 
     items.add(new ItemA("Une0")); 
     items.add(new ItemA("Une0-")); 
     items.add(new ItemB("bbb6", "cc5c")); 
     items.add(new ItemB("bbb7", "cc4c")); 
     items.add(new ItemB("bbb7", "c2cc")); 
     items.add(new ItemB("bbb8", "c1cc")); 
     items.add(new ItemB("bbb9", "cc6c")); 
     items.add(new ItemB("bbb0", "cc8c")); 
     items.add(new ItemB("bbb0", "cc0c")); 
     items.add(new ItemB("bb3b", "cc6c")); 

     SpecialAdapter b = new SpecialAdapter(this, items); 
     lv.setAdapter(b); 

    } 

    private class SpecialAdapter extends BaseAdapter{ 

     List<Items> list; 
     Context context; 

     public SpecialAdapter(Context context, List<Items> list) { 
      this.list = list; 
      this.context = context; 
     } 

     public Context getContext(){ 
      return this.context; 
     } 

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

     @Override 
     public Items getItem(int position) { 
      return list.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return list.get(position).hashCode(); 
     } 

     @Override 
     public int getViewTypeCount() { 
      return 2; 
     } 

     @Override 
     public int getItemViewType(int position) { 
      Items b = getItem(position); 
      if(b instanceof ItemA){ 
       return 0; 
      }else{ 
       return 1; 
      } 
     } 



     @Override 
     public View getView(int position, View v, ViewGroup parent) { 
      Items o = getItem(position); 
      if(v == null){ 
       LayoutInflater vi = (LayoutInflater)this.getContext() 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
       if(getItemViewType(position) == 0){ 
        v = vi.inflate(
            android.R.layout.simple_list_item_multiple_choice, 
            null 
            ); 
        Log.i(this.getClass().getName(), 
             "Inflate two line" 
            ); 
       }else{ 
        v = vi.inflate(
            android.R.layout.two_line_list_item, 
            null 
            ); 
        Log.i(this.getClass().getName(), 
            "Inflate one line" 
            ); 
       } 
      } 

      switch (getItemViewType(position)) { 
      case 0: 
       ItemA oa = (ItemA)o; 
       ((TextView)v.findViewById(android.R.id.text1)).setText(oa.toString()); 
       break; 
      case 1: 
       ItemB ob = (ItemB)o; 
       ((TextView)v.findViewById(android.R.id.text1)).setText(ob.toString()); 
       ((TextView)v.findViewById(android.R.id.text2)).setText(ob.getClasse()); 
       break; 
      } 
      return v; 
     } 

    } 

    private abstract class Items {} 

    private class ItemA extends Items { 
     String name; 

     public ItemA(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "ItemA: " + name; 
     } 
    } 

    private class ItemB extends Items { 
     private String name; 
     private String classe; 

     public ItemB(String name, String classe) { 
      this.name = name; 
      this.classe = classe; 
     } 

     public String getClasse(){ 
      return classe; 
     } 

     @Override 
     public String toString() { 
      return "ItemB: " + name; 
     } 
    } 
} 

私はサンプルを書き、すぐにアップデートを提供しようとします。ビューがリサイクルされると、リサイクルされたビューがItemTypeに対応するかどうかを確認する必要があるため、何かが欠けていると思います。しかし、あなたは間違いなくListViewだけでそれを行うことができます。スクロール可能なものはありません。

+0

実際には、ListViewの適応性を使用したいと考えています。これは、アダプタを使用してインデックスで要素をすばやく挿入および削除できる方法です。 LinearLayoutでそれを行う方法があれば教えてください。しかし、私は2つ以上のListViewを必要としています。なぜなら、私は両方をScrollViewに入れたいのです(私は実際にListViewをスクロール可能にしたくありません)。 – jcuenod

+0

コードが明確に見えるか教えてください。あなたが持っていたリストビューのそれぞれについて、複数のビュータイプ1を処理する必要があります。 ItemAが常にItemBの上にあるように、アイテムにソートを追加することもできます。 –

+0

これは意味がありますが、これが私の指摘です。なぜGoogleは入れ子になったスクロール可能な要素だけを許可するのではないのですか?私たちはUIの決定をしましょう、そしてもし失敗すればそれはそうですが、私たちに機能を与えてください...私はあなたのコードを理解しますが、私の要点は不要だということです。 – jcuenod

3

スクロール不可能なListViewとしてLinearLayoutを使用できます。 ListViewの力の多くは、要素の遅延読み込みをどう扱うかです。これはスクロールできないバージョンのコンテキストでは実際には意味をなさない。

本当に、あなたはおそらくあなたのUIを再考する必要があります。なぜ、複数のスクロールセクションが必要ですか?それはユーザーの視点からは本当に非友好的なようです。ヘッダーまたはフッターを使用して、ListViewの上と下の物を簡単に配置できます。

+0

私は、要素をインデックスで追加したり削除したりするためにListViewを必要とし、基本的にはarraylistにアタッチします。 LinearLayoutでそれを行うことができれば、どうすればいいか教えてください。 – jcuenod

+0

これはおそらくTableLayoutで行うことができます:http://developer.android.com/reference/android/widget/TableLayout.html –

+0

'addView'はTableLayoutで有望ですが、' setAdapter'と同等のものがありますか? – jcuenod