私はこの問題の解決策を探し回ってみましたが、私が見つけることができる唯一の答えは「 ScrollViewにListViewを入れないでください 」のようです。 。私はなぜでも本当の説明をまだ見ていません。私が見つけることができる唯一の理由は、グーグルがあなたがそうすることを望んでいるべきだとは思わないということです。そうですね、そうしました。
それで、問題は、どのようにしてListViewを最小の高さに折りたたまずにScrollViewに配置できるかということです。
スクロールしないようにするためにListView
を使用することは非常に費用がかかり、ListView
の全目的に反します。あなたはではなくこれをするべきです。代わりにLinearLayout
を使ってください。
これが私の解決策です。私はAndroidプラットフォームにはかなり慣れていません。特に、.measureを直接呼び出してLayoutParams.height
プロパティを直接設定するという部分では、これは少し厄介です。
あなたがしなければならないのはUtility.setListViewHeightBasedOnChildren(yourListView)
を呼ぶことだけです、そしてそれはアイテムの高さを正確に収容するためにリサイズされます。
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem instanceof ViewGroup) {
listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
これは間違いなく動作します............
レイアウトXMLファイル内の<ScrollView ></ScrollView>
をCustom ScrollView
のようなこの<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
に置き換えるだけです。
package com.tmd.utils;
import Android.content.Context;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.view.MotionEvent;
import Android.widget.ScrollView;
public class VerticalScrollview extends ScrollView{
public VerticalScrollview(Context context) {
super(context);
}
public VerticalScrollview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" );
super.onTouchEvent(ev);
break;
case MotionEvent.ACTION_MOVE:
return false; // redirect MotionEvents to ourself
case MotionEvent.ACTION_CANCEL:
Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" );
super.onTouchEvent(ev);
break;
case MotionEvent.ACTION_UP:
Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" );
return false;
default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() );
return true;
}
}
ListView
をScrollView
の中に入れることに興味があるので、ListView
をScrollView
として使うことができます。 ListView
に含まれるべきものはListView
の中に置くことができます。 ListView
の上部と下部の他のレイアウトは、ListView
のヘッダーとフッターにレイアウトを追加することで配置できます。それでListView
全体があなたにスクロールの経験を与えるでしょう。
たくさんのScrollViewの中にListViewを持つことが意味をなさない状況がたくさんあります。
これがDougWの提案に基づいたコードです。
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0) {
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
}
view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
各埋め込みリストビューでsetListViewHeightBasedOnChildren(listview)を呼び出します。
ListViewは、実際にはすべての項目を表示するのに十分な高さになるようにそれ自体を測定することができますが、単にwrap_content(MeasureSpec.UNSPECIFIED)を指定した場合はこれを行いません。 MeasureSpec.AT_MOSTで高さが与えられると、これを行います。この知識があれば、この問題を解決するための非常に単純なサブクラスを作成することができます。このサブクラスは、上記のどのソリューションよりもはるかに優れています。あなたはまだこのサブクラスでwrap_contentを使うべきです。
public class ListViewForEmbeddingInScrollView extends ListView {
public ListViewForEmbeddingInScrollView(Context context) {
super(context);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 4, MeasureSpec.AT_MOST));
}
}
HeightMeasureSpecを非常に大きいサイズ(Integer.MAX_VALUE >> 4)でAT_MOSTになるように操作すると、ListViewは指定された(非常に大きい)高さまでのすべての子を測定し、それに応じてその高さを設定します。
いくつかの理由で、これは他のソリューションよりもうまく機能します。
不利な点として、これを行うことは変更される可能性があるSDKの文書化されていない動作に依存していると主張することができます。一方で、これがwrap_contentがListViewで実際に機能する方法であり、現在のwrap_contentの動作が壊れているに過ぎないことを主張できます。
将来その動作が変わる可能性があるのであれば、単純にonMeasure関数とそれに関連する関数をListView.Javaから自分のサブクラスにコピーしてから、onMeasureを介したAT_MOSTパスをUNSPECIFIEDに対しても実行します。
ちなみに、これは少数のリストアイテムを扱うときには、これが完全に有効なアプローチであると考えています。 LinearLayoutと比較すると非効率的かもしれませんが、項目数が少ない場合は、LinearLayoutを使用するのは不要な最適化であり、したがって不要な複雑さです。
組み込みの設定があります。 ScrollView上で:
Android:fillViewport="true"
Javaでは、
mScrollView.setFillViewport(true);
Romain Guyがここで詳細に説明しています。 http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/
スクロールできないカスタム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();
}
}
レイアウトリソースファイル内
<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>
Javaファイル内
次のように、ListViewではなく、customListviewのオブジェクトを作成します。NonScrollListView
2つのスクロールsimulteniuoslyを使用することはできませんでした。ListViewの全長を取得して、その合計の高さでlistviewを展開することになります。コード内でsetListViewHeightBasedOnChildren(lv)メソッドをコピーしてlistviewを展開すると、scrollview内でlistviewを使用できます。\layout xmlファイル
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<ScrollView
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="#1D1D1D"
Android:orientation="vertical"
Android:scrollbars="none" >
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="#1D1D1D"
Android:orientation="vertical" >
<TextView
Android:layout_width="fill_parent"
Android:layout_height="40dip"
Android:background="#333"
Android:gravity="center_vertical"
Android:paddingLeft="8dip"
Android:text="First ListView"
Android:textColor="#C7C7C7"
Android:textSize="20sp" />
<ListView
Android:id="@+id/first_listview"
Android:layout_width="260dp"
Android:layout_height="wrap_content"
Android:divider="#00000000"
Android:listSelector="#ff0000"
Android:scrollbars="none" />
<TextView
Android:layout_width="fill_parent"
Android:layout_height="40dip"
Android:background="#333"
Android:gravity="center_vertical"
Android:paddingLeft="8dip"
Android:text="Second ListView"
Android:textColor="#C7C7C7"
Android:textSize="20sp" />
<ListView
Android:id="@+id/secondList"
Android:layout_width="260dp"
Android:layout_height="wrap_content"
Android:divider="#00000000"
Android:listSelector="#ffcc00"
Android:scrollbars="none" />
</LinearLayout>
</ScrollView>
</LinearLayout>
activityクラスのonCreateメソッド:
import Java.util.ArrayList;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.Menu;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ArrayAdapter;
import Android.widget.ListAdapter;
import Android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_inside_scrollview);
ListView list_first=(ListView) findViewById(R.id.first_listview);
ListView list_second=(ListView) findViewById(R.id.secondList);
ArrayList<String> list=new ArrayList<String>();
for(int x=0;x<30;x++)
{
list.add("Item "+x);
}
ArrayAdapter<String> adapter=new ArrayAdapter<String>(getApplicationContext(),
Android.R.layout.simple_list_item_1,list);
list_first.setAdapter(adapter);
setListViewHeightBasedOnChildren(list_first);
list_second.setAdapter(adapter);
setListViewHeightBasedOnChildren(list_second);
}
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
これは、DougW、Good Guy Greg、およびPaulによる回答の組み合わせです。これをカスタムのリストビューアダプタと標準以外のリストアイテムで使用しようとすると、アプリケーションがクラッシュしました(Nexの回答でクラッシュしました)。
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem instanceof ViewGroup)
listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
@ DougWのUtility
をC#に変換しました(Xamarinで使用)。以下は、リスト内の固定高の項目に対しては正常に機能し、項目の一部だけが標準項目より少し大きい場合は、ほぼ正常、または少なくとも良いスタートになるでしょう。
// You will need to put this Utility class into a code file including various
// libraries, I found that I needed at least System, Linq, Android.Views and
// Android.Widget.
using System;
using System.Linq;
using Android.Views;
using Android.Widget;
namespace UtilityNamespace // whatever you like, obviously!
{
public class Utility
{
public static void setListViewHeightBasedOnChildren (ListView listView)
{
if (listView.Adapter == null) {
// pre-condition
return;
}
int totalHeight = listView.PaddingTop + listView.PaddingBottom;
for (int i = 0; i < listView.Count; i++) {
View listItem = listView.Adapter.GetView (i, null, listView);
if (listItem.GetType () == typeof(ViewGroup)) {
listItem.LayoutParameters = new LinearLayout.LayoutParams (ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
}
listItem.Measure (0, 0);
totalHeight += listItem.MeasuredHeight;
}
listView.LayoutParameters.Height = totalHeight + (listView.DividerHeight * (listView.Count - 1));
}
}
}
@DougWのおかげで、OtherPeople'sCodeを使用しなければならなかったときに、私はタイトスポットから抜け出しました。 :-)
ListViewはすでに が ScrollViewであるため、ScrollViewにListViewを配置しないでください。そのため、ScrollViewをScrollViewに配置するようなものです。
あなたは何を達成しようとしていますか?
ScrollView内でListViewを使用する場合、2つの問題があります。
1- ListViewは、その子の高さまで完全に拡張する必要があります。このListViewはこれを解決します:
public class ListViewExpanded extends ListView
{
public ListViewExpanded(Context context, AttributeSet attrs)
{
super(context, attrs);
setDividerHeight(0);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST));
}
}
仕切りの高さは0でなければなりません。代わりに行のパディングを使用してください。
2- ListViewはタッチイベントを消費するので、ScrollViewはいつものようにスクロールできません。このScrollViewはこの問題を解決します:
public class ScrollViewInterceptor extends ScrollView
{
float startY;
public ScrollViewInterceptor(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e)
{
onTouchEvent(e);
if (e.getAction() == MotionEvent.ACTION_DOWN) startY = e.getY();
return (e.getAction() == MotionEvent.ACTION_MOVE) && (Math.abs(startY - e.getY()) > 50);
}
}
これが私がトリックをやるために見つけた最良の方法です!
これが私のために働いた唯一のものです:
ロリポップ以降ではあなたが使用することができます
yourtListView.setNestedScrollingEnabled(true);
古いバージョンのOSとの後方互換性が必要な場合は、このビューのネストスクロールを有効または無効にします。RecyclerViewを使用する必要があります。
ちょっと私は同様の問題を抱えていた。スクロールしないリストビューを表示したいのですが、パラメータの操作はうまくいきましたが、効率が悪く、デバイスごとに動作が異なることがわかりました。 。
db = new dbhelper(this);
cursor = db.dbCursor();
int count = cursor.getCount();
if (count > 0)
{
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.layoutId);
startManagingCursor(YOUR_CURSOR);
YOUR_ADAPTER(**or SimpleCursorAdapter **) adapter = new YOUR_ADAPTER(this,
R.layout.itemLayout, cursor, arrayOrWhatever, R.id.textViewId,
this.getApplication());
int i;
for (i = 0; i < count; i++){
View listItem = adapter.getView(i,null,null);
linearLayout.addView(listItem);
}
}
注:これを使用すると、ビューが再描画されないため、notifyDataSetChanged();
は意図したとおりに機能しません。回避策が必要な場合はこれを行ってください
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
removeAndRedrawViews();
}
});
私が使用する解決策は、ListViewのheaderViewとfooterViewとしてScrollViewのすべてのContent(listViewの上下にあるべきもの)を追加することです。
それでそれは同様に機能します、またconvertviewはそれがあるべき姿であるという理由で再開されます。
これらの答えはすべて間違っています。リストビューをスクロールビューに入れようとしているのなら、デザインを考え直すべきです。 ScrollViewをScrollViewに配置しようとしています。リストを妨害すると、リストのパフォーマンスが低下します。 Androidではこのように設計されています。
リストを他の要素と同じスクロールにしたい場合は、アダプタの単純なswitch文を使用して他の項目をリストの先頭に追加するだけです。
class MyAdapter extends ArrayAdapter{
public MyAdapter(Context context, int resource, List objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewItem viewType = getItem(position);
switch(viewType.type){
case TEXTVIEW:
convertView = layouteInflater.inflate(R.layout.textView1, parent, false);
break;
case LISTITEM:
convertView = layouteInflater.inflate(R.layout.listItem, parent, false);
break; }
return convertView;
}
}
リストアダプタは、表示されているものだけをレンダリングするので、すべてを処理できます。
それが不可能だった前に。しかし、新しいAppcompatライブラリとDesignライブラリのリリースで、これを達成することができます。
NestedScrollView https://developer.Android.com/reference/Android/support/v4/widget/NestedScrollView.html を使用するだけです。
私はそれがListviewで動作するかどうかはわかりませんが、RecyclerViewで動作します。
コードスニペット:
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</Android.support.v4.widget.NestedScrollView>
これは、 @ djunod の 答え を少し修正したものです。完璧に動作させる
public static void setListViewHeightBasedOnChildren(ListView listView)
{
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null) return;
if(listAdapter.getCount() <= 1) return;
int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
int totalHeight = 0;
View view = null;
for(int i = 0; i < listAdapter.getCount(); i++)
{
view = listAdapter.getView(i, view, listView);
view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
}
提案されたsetListViewHeightBasedOnChildren()メソッドはほとんどの場合に機能しますが、場合によっては、特に多くの項目で、最後の要素が表示されません。それで、私は単純なバージョンのListViewの振る舞いを模倣して、任意のアダプタコードを再利用することにしました。これがListViewの代替手段です。
import Android.content.Context;
import Android.database.DataSetObserver;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.view.View;
import Android.widget.LinearLayout;
import Android.widget.ListAdapter;
public class StretchedListView extends LinearLayout {
private final DataSetObserver dataSetObserver;
private ListAdapter adapter;
private OnItemClickListener onItemClickListener;
public StretchedListView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(LinearLayout.VERTICAL);
this.dataSetObserver = new DataSetObserver() {
@Override
public void onChanged() {
syncDataFromAdapter();
super.onChanged();
}
@Override
public void onInvalidated() {
syncDataFromAdapter();
super.onInvalidated();
}
};
}
public void setAdapter(ListAdapter adapter) {
ensureDataSetObserverIsUnregistered();
this.adapter = adapter;
if (this.adapter != null) {
this.adapter.registerDataSetObserver(dataSetObserver);
}
syncDataFromAdapter();
}
protected void ensureDataSetObserverIsUnregistered() {
if (this.adapter != null) {
this.adapter.unregisterDataSetObserver(dataSetObserver);
}
}
public Object getItemAtPosition(int position) {
return adapter != null ? adapter.getItem(position) : null;
}
public void setSelection(int i) {
getChildAt(i).setSelected(true);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public ListAdapter getAdapter() {
return adapter;
}
public int getCount() {
return adapter != null ? adapter.getCount() : 0;
}
private void syncDataFromAdapter() {
removeAllViews();
if (adapter != null) {
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View view = adapter.getView(i, null, this);
boolean enabled = adapter.isEnabled(i);
if (enabled) {
final int position = i;
final long id = adapter.getItemId(position);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(null, v, position, id);
}
}
});
}
addView(view);
}
}
}
}
Vinayのコード のおかげで、スクロールビューの中にリストビューを入れることができないのに、そのようなものが必要なときのコード
LayoutInflater li = LayoutInflater.from(this);
RelativeLayout parent = (RelativeLayout) this.findViewById(R.id.relativeLayoutCliente);
int recent = 0;
for(Contatto contatto : contatti)
{
View inflated_layout = li.inflate(R.layout.header_listview_contatti, layout, false);
inflated_layout.setId(contatto.getId());
((TextView)inflated_layout.findViewById(R.id.textViewDescrizione)).setText(contatto.getDescrizione());
((TextView)inflated_layout.findViewById(R.id.textViewIndirizzo)).setText(contatto.getIndirizzo());
((TextView)inflated_layout.findViewById(R.id.textViewTelefono)).setText(contatto.getTelefono());
((TextView)inflated_layout.findViewById(R.id.textViewMobile)).setText(contatto.getMobile());
((TextView)inflated_layout.findViewById(R.id.textViewFax)).setText(contatto.getFax());
((TextView)inflated_layout.findViewById(R.id.textViewEmail)).setText(contatto.getEmail());
RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
if (recent == 0)
{
relativeParams.addRule(RelativeLayout.BELOW, R.id.headerListViewContatti);
}
else
{
relativeParams.addRule(RelativeLayout.BELOW, recent);
}
recent = inflated_layout.getId();
inflated_layout.setLayoutParams(relativeParams);
//inflated_layout.setLayoutParams( new RelativeLayout.LayoutParams(source));
parent.addView(inflated_layout);
}
relativeLayoutはScrollView内にあるため、すべてスクロール可能になります。
これを試して、これは私のために動作します、私はそれがどこでそれを見つけたのか忘れていました。
final ListView AturIsiPulsaDataIsiPulsa = (ListView) findViewById(R.id.listAturIsiPulsaDataIsiPulsa);
AturIsiPulsaDataIsiPulsa.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;
}
});
AturIsiPulsaDataIsiPulsa.setClickable(true);
AturIsiPulsaDataIsiPulsa.setAdapter(AturIsiPulsaDataIsiPulsaAdapter);
編集!、ようやくコードを入手した場所がわかりました。ここに ! : ScrollView内のListViewがAndroid上でスクロールしていません
この ライブラリは、この問題に対する最も簡単で迅速な解決策です。
LinearLayoutがsetAdapterメソッドを持っていれば、この問題は完全に解消されるでしょう。
あなたが実際に他のスクローリングビューの中にスクロールリストビューを望むならば、これは助けにはならないが、そうでなければこれは少なくともあなたに考えを与えるでしょう。
スクロールしたいすべてのコンテンツを組み合わせて、それにListViewのアダプタを設定するためのカスタムアダプタを作成する必要があります。
私は便利なサンプルコードを持っていません、しかしあなたが何かが欲しいなら。
<ListView/>
(other content)
<ListView/>
それからあなたはそのコンテンツのすべてを表すアダプタを作成する必要があります。 ListView/Adaptersは、さまざまなタイプを処理するのに十分スマートですが、アダプタを自分で作成する必要があります。
Android UI APIは、他のほとんどすべてのものほど成熟しているわけではないので、他のプラットフォームと同じ優れた点はありません。また、Android上で何かをするときには、たぶんAndroid(unix)の考え方に従う必要があります。小さな部分の機能を集めてそれを実現するためにあなた自身のコードの束を書かなければならないでしょう作業。
リストビューをScrollview内に配置するのではなく、リストビューとScrollviewのオープンの間の残りのコンテンツを別のビューとして配置し、そのビューをリストビューのヘッダーとして設定します。それであなたは最終的にScrollを担当する唯一のリストビューになるでしょう。
ListView
をScrollView
の中に配置すると、2つの問題が発生します。 1つはScrollView
がUNSPECIFIEDモードでその子を測定するため、ListView
は1つのアイテムのみに対応するように独自の高さを設定し(理由はわかりません)、もう1つはScrollView
がタッチイベントをインターセプトしますListView
はスクロールしません。
しかし、canを使用してListView
をScrollView
の内側に配置し、いくつかの回避策を講じます。 この投稿 、私は回避策を説明しています。この回避策により、ListView
のリサイクル機能も保持できます。