web-dev-qa-db-ja.com

ScrollView内のスクロールできないListView

私はこのようなレイアウトを作成しようとしています:

問題は、ListViewsをスクロールできないようにすることです。 必要なだけ高くし、画面全体をスクロール可能にしたいListViewの高さをwrap_contentに設定した場合、作業。これを機能させる唯一の方法は、特定の高さを設定することです-しかし、ListViewにいくつのアイテムがあるかわかりません。

ListViewScrollViewの中に入れてはいけないことを知っています-しかし、ListViewをすべてのアイテムを表示するためだけにスクロール可能にしたくない。

たぶんそれを機能させるより良い方法がありますか?

64
Dennis

スクロールできないカスタムリストビューを作成します

public class NonScrollListView extends ListView {

    public NonScrollListView(Context context) {
        super(context);
    }
    public NonScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                    Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();    
    }
}

レイアウトリソースファイル内

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fadingEdgeLength="0dp"
    Android:fillViewport="true"
    Android:overScrollMode="never"
    Android:scrollbars="none" >

    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" >

        <!-- com.Example Changed with your Package name -->

        <com.Example.NonScrollListView
            Android:id="@+id/lv_nonscroll_list"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" >
        </com.Example.NonScrollListView>

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/lv_nonscroll_list" >

            <!-- Your another layout in scroll view -->

        </RelativeLayout>
    </RelativeLayout>

</ScrollView>

In Java File

ListViewの代わりにcustomListviewのオブジェクトを作成します:
NonScrollListView non_scroll_list =(NonScrollListView)findViewById(R.id.lv_nonscroll_list);

149

listviewを使用する必要はまったくありません。

本当に考えてみると、listviewLinearLayoutに置き換えることができます。 Adapterは同じですが、アダプターをlistviewに接続する代わりに、データのforループでアダプターのgetView関数を呼び出して、垂直linearlayoutのビューを取得しました。

ただし、この方法は、リストに少数のアイテムがあり、それらのアイテムの表示表現がメモリ集約型でない場合にのみお勧めします。

9
Samarth Jain

これを行う最良の方法(2017年)は、RecyclerViewNestedScrollViewを使用することです。

ハックは不要で、思い通りに動作します。

2

まあ、クールなAndroid Mark Murphy別名CommonsWareという名前の男がいます。彼は CWACマージアダプター という名前の非常に便利なコンポーネントを作成しました。 'XMLからではなく、動的にビューを追加する必要がありますが、シンプルなUIを考慮すると、これは問題になりません。どのようなデータかわからないような場合に使用しますスクロールすることになっています。

(ライセンス上の理由で)使用したくない場合は、(2つの連続したリストビューの代わりに)1つのリストビューを使用して、getItemViewsCountgetItemViewTypeおよびgetView上記のレイアウトを与えるため。検索した場合Android listview different rowsGoogleで役立つ情報が見つかります。たとえば、 this link 、または this one です。

ただし、マージアダプターを使用します。

0
gunar

スクロール可能にしたいListViewを選択し、その後、メソッド 'setOnTouchListener'を追加して、システムが自動的にListView内にスクロールを挿入します。

final ListView listview = (ListView) findViewById(R.id.list);


    listview.setOnTouchListener(new ListView.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int action = event.getAction();
            switch (action)
            {
                case MotionEvent.ACTION_DOWN:
                    // Disallow ScrollView to intercept touch events.
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    break;

                case MotionEvent.ACTION_UP:
                    // Allow ScrollView to intercept touch events.
                    v.getParent().requestDisallowInterceptTouchEvent(false);
                    break;
            }

            // Handle ListView touch events.
            v.onTouchEvent(event);
            return true;
        }
    });
    listview.setClickable(true);

私はそれがあなたのために働くことを願っています

0
Houssem CH

アイテムの高さ/幅を計算できる場合は簡単な解決策があります... ListViewの親Linearlayoutを作成し、Javaから親Heightを修正するだけです。

enter image description here

このビューを設計する必要があるとします...今、親レイアウトサイズはJavaから定義しています...

final LinearLayout parent=(LinearLayout)findViewById(R.id.parent);
final ListView  listview=(ListView)findViewById(R.id.listview);
parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp )));
//number_of_item_in_list is list side ~ listArray.size();
//per_item_size_in_dp = calculate item size in dp. Ex: 80dp

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

それで全部です :)

0