2010-12-02 6 views
12

スクロールしないListViewが必要で、ListView全体を表示する必要があります。これは、私の画面全体がScrollViewであり、ウィジェットをRelativeLayoutでディスパッチするので、ListViewのスクロールは必要ありません。スクロールできないリストビューを取得するには?

私はxmlではなく、コードで私のUIを設定しました。

私はlistView.setScrollContainer(false)を使用しましたが、動作しません。理由はわかりません。

ありがとうございました。

答えて

10

リストビューをスクロールビューに配置しないでも機能しません。スクロールしない項目のリストが必要な場合は、線形レイアウトと呼ばれます。

+1

はい、私はそれをありがとうございます。しかし、私はどのようにライン上のclic上でListViewと同じことを行う? (申し訳ありません、私はアンドロイド・ニュービーです。) – Istao

+3

@Istao:OnClickListenerまたはOnTouchListenerをクリックまたはタッチすると起動するビューにバインドできます。 – Flo

+0

FloとFalmarriに感謝します。 – Istao

4

あなたがやろうとしている正確に何に応じて、ScrollViewを捨て、代わりにListViewaddHeaderView(View)addFooterView(View)を使用して問題を解決できることがあります。

15

正解is here.

はちょうどあなたのListViewにこのリスナーを割り当てる:

listView.setOnTouchListener(new OnTouchListener() { 

    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      return true; // Indicates that this has been handled by you and will not be forwarded further. 
     } 
     return false; 
    } 
}); 
14

私は、このために非常に簡単な解決策を見つけました。リストビューのアダプターを取得して、すべての項目が表示されたらそのサイズを計算してください。 このソリューションは、ScrollView内でも機能するという利点があります。

例:

public void justifyListViewHeightBasedOnChildren (ListView listView) { 

    ListAdapter adapter = listView.getAdapter(); 

    if (adapter == null) { 
     return; 
    } 
    ViewGroup vg = listView; 
    int totalHeight = 0; 
    for (int i = 0; i < adapter.getCount(); i++) { 
     View listItem = adapter.getView(i, null, vg); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams par = listView.getLayoutParams(); 
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)); 
    listView.setLayoutParams(par); 
    listView.requestLayout(); 
} 

この関数を呼び出しは、あなたのListViewオブジェクトの上を通過:

justifyListViewHeightBasedOnChildren(myListview); 

上に示した関数は中柱の変形例である: Disable scrolling in listview

に注意してくださいアダプタをリストビューに設定した後でこの関数を呼び出してください。アダプタ内のエントリのサイズが変更されている場合は、この関数も呼び出す必要があります。

+2

ありがとうございます。あなたの答えは素晴らしいです。リストビューには、これがまさに私たちが望むものであることが分かるはずです(私は、ちょっとリストビューのスクロールビューが必要なのですが、リストビューでフラグメントビューを再利用しているので、 LinearLayoutを変更して使用する)。私はこれを行うためのより良い方法を見つけることに失敗したので、あなたの答えは私が見つけることができる最高のものです。それはより多くのupvotesを得ることを望みます。それは彼らに値する。 – acrespo

+0

も私のために働いています。 –

0

私はBaseAdapterUnscrollableを思いついた。基本的にViewGroupコンテナにビューを追加するだけです。実装はBaseAdapterのようなものです。プロジェクトのようなスクロールできないリストをいくつか使用するとかなり便利です。onCreateで

PeopleAdapter peopleAdapter = new PeopleAdapter(this, personList, containerPeopleLinearLayout); 
peopleAdapter.setOnItemClickListener(this); 
peopleAdapter.drawItems(); 

あなたの特定のアダプタ:

public class PeopleAdapter extends BaseAdapterNonScrollable<Person> { 

public PeopleAdapter(Context context, List<Person> items, LinearLayout container) { 
    super(context, items, container); 
} 

@Override 
public View getView(View container, Person person) { 
    TextView textView = (TextView) LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, null); 
    textView.setText(person.getName()); 
    return textView; 
} 

}

BaseAdapterNonScrollable(単なるコピー):

public abstract class BaseAdapterNonScrollable<T> implements NonScrollable, OnItemClick { 

public Context context; 
private ViewGroup containerViewGroup; 
private List<T> itemObjectList; 
private OnItemClick itemClickListener; 

public BaseAdapterNonScrollable(Context context, List<T> items, ViewGroup containerViewGroup) { 
    this.context = context; 
    this.itemObjectList = items; 
    this.containerViewGroup = containerViewGroup; 
} 

@Override 
public void drawItems() { 
    if (containerViewGroup == null || itemObjectList.size() == 0) { 
     return; 
    } 

    if (containerViewGroup.getChildCount() > 0) { 
     containerViewGroup.removeAllViews(); 
    } 

    //draw all items 
    for (int i = 0; i < itemObjectList.size(); i++) { 
     final int position = i; 
     final View itemView = getView(containerViewGroup, itemObjectList.get(i)); 
     if (itemView != null) { 
      containerViewGroup.addView(itemView); 
      //handle item click event 
      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (itemClickListener != null) { 
         itemClickListener.onItemClick(itemObjectList, position); 
        } 
       } 
      }); 
     } 
    } 
} 

public void setOnItemClickListener(OnItemClick onItemClick) { 
    this.itemClickListener = onItemClick; 
} 

public abstract View getView(View container, T itemObject); 

@Override 
public void onItemClick(List<?> itemList, int position) { 
} 

}

インタフェース

public interface NonScrollable { 
    void drawItems(); 
} 

public interface OnItemClick { 
    void onItemClick(List<?> itemList, int position); 
} 
0

あなたはこれも行選択を無効にlistview.setEnabled(false)

を使用することができますスクロールを無効にします。

関連する問題