私はこのようなレイアウトを作成しようとしています:
問題は、ListViews
をスクロールできないようにすることです。 必要なだけ高くし、画面全体をスクロール可能にしたいListView
の高さをwrap_content
に設定した場合、作業。これを機能させる唯一の方法は、特定の高さを設定することです-しかし、ListView
にいくつのアイテムがあるかわかりません。
ListView
をScrollView
の中に入れてはいけないことを知っています-しかし、ListView
をすべてのアイテムを表示するためだけにスクロール可能にしたくない。
たぶんそれを機能させるより良い方法がありますか?
スクロールできないカスタムリストビューを作成します
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);
listview
を使用する必要はまったくありません。
本当に考えてみると、listview
はLinearLayout
に置き換えることができます。 Adapter
は同じですが、アダプターをlistview
に接続する代わりに、データのforループでアダプターのgetView
関数を呼び出して、垂直linearlayout
のビューを取得しました。
ただし、この方法は、リストに少数のアイテムがあり、それらのアイテムの表示表現がメモリ集約型でない場合にのみお勧めします。
これを行う最良の方法(2017年)は、RecyclerView
とNestedScrollView
を使用することです。
ハックは不要で、思い通りに動作します。
まあ、クールなAndroid Mark Murphy別名CommonsWareという名前の男がいます。彼は CWACマージアダプター という名前の非常に便利なコンポーネントを作成しました。 'XMLからではなく、動的にビューを追加する必要がありますが、シンプルなUIを考慮すると、これは問題になりません。どのようなデータかわからないような場合に使用しますスクロールすることになっています。
(ライセンス上の理由で)使用したくない場合は、(2つの連続したリストビューの代わりに)1つのリストビューを使用して、getItemViewsCount
、getItemViewType
およびgetView
上記のレイアウトを与えるため。検索した場合Android listview different rows
Googleで役立つ情報が見つかります。たとえば、 this link 、または this one です。
ただし、マージアダプターを使用します。
スクロール可能にしたい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);
私はそれがあなたのために働くことを願っています
アイテムの高さ/幅を計算できる場合は簡単な解決策があります... ListViewの親Linearlayoutを作成し、Javaから親Heightを修正するだけです。
このビューを設計する必要があるとします...今、親レイアウトサイズは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);
}
それで全部です :)