web-dev-qa-db-ja.com

ListViewを折りたたまずにScrollViewに配置する方法

私はこの問題の解決策を探し回ってみましたが、私が見つけることができる唯一の答えは「 ScrollViewにListViewを入れないでください 」のようです。 。私はなぜでも本当の説明をまだ見ていません。私が見つけることができる唯一の理由は、グーグルがあなたがそうすることを望んでいるべきだとは思わないということです。そうですね、そうしました。

それで、問題は、どのようにしてListViewを最小の高さに折りたたまずにScrollViewに配置できるかということです。

344
DougW

スクロールしないようにするためにListViewを使用することは非常に費用がかかり、ListViewの全目的に反します。あなたはではなくこれをするべきです。代わりにLinearLayoutを使ってください。

192
Romain Guy

これが私の解決策です。私は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);
    }
}
258
DougW

これは間違いなく動作します............
レイアウト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;
    }
}
89
Atul Bhardwaj

ListViewScrollViewの中に入れることに興味があるので、ListViewScrollViewとして使うことができます。 ListViewに含まれるべきものはListViewの中に置くことができます。 ListViewの上部と下部の他のレイアウトは、ListViewのヘッダーとフッターにレイアウトを追加することで配置できます。それでListView全体があなたにスクロールの経験を与えるでしょう。

24
Arun

たくさんの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)を呼び出します。

21
djunod

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は指定された(非常に大きい)高さまでのすべての子を測定し、それに応じてその高さを設定します。

いくつかの理由で、これは他のソリューションよりもうまく機能します。

  1. それはすべてを正しく測定します(パディング、仕切り)
  2. メジャーパス中にListViewを測定します
  3. #2のため、追加コードなしでアイテムの幅または数の変更を正しく処理します。

不利な点として、これを行うことは変更される可能性があるSDKの文書化されていない動作に依存していると主張することができます。一方で、これがwrap_contentがListViewで実際に機能する方法であり、現在のwrap_contentの動作が壊れているに過ぎないことを主張できます。

将来その動作が変わる可能性があるのであれば、単純にonMeasure関数とそれに関連する関数をListView.Javaから自分のサブクラスにコピーしてから、onMeasureを介したAT_MOSTパスをUNSPECIFIEDに対しても実行します。

ちなみに、これは少数のリストアイテムを扱うときには、これが完全に有効なアプローチであると考えています。 LinearLayoutと比較すると非効率的かもしれませんが、項目数が少ない場合は、LinearLayoutを使用するのは不要な最適化であり、したがって不要な複雑さです。

17
Jason Y

組み込みの設定があります。 ScrollView上で:

Android:fillViewport="true"

Javaでは、

mScrollView.setFillViewport(true);

Romain Guyがここで詳細に説明しています。 http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

12
TalkLittle

スクロールできないカスタム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

8

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);
      }
8
Ashish Saini

これは、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);
    }
4
Abandoned Cart

@ 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を使用しなければならなかったときに、私はタイトスポットから抜け出しました。 :-)

3
Phil Ryan

ListViewはすでにScrollViewであるため、ScrollViewにListViewを配置しないでください。そのため、ScrollViewをScrollViewに配置するようなものです。

あなたは何を達成しようとしていますか?

3
Cheryl Simon

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);
    }
}

これが私がトリックをやるために見つけた最良の方法です!

2
Ali

これが私のために働いた唯一のものです:

ロリポップ以降ではあなたが使用することができます

yourtListView.setNestedScrollingEnabled(true);

古いバージョンのOSとの後方互換性が必要な場合は、このビューのネストスクロールを有効または無効にします。RecyclerViewを使用する必要があります。

2
JackA

ちょっと私は同様の問題を抱えていた。スクロールしないリストビューを表示したいのですが、パラメータの操作はうまくいきましたが、効率が悪く、デバイスごとに動作が異なることがわかりました。 。

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();

            }

        });
2
PSchuette

私が使用する解決策は、ListViewのheaderViewとfooterViewとしてScrollViewのすべてのContent(listViewの上下にあるべきもの)を追加することです。

それでそれは同様に機能します、またconvertviewはそれがあるべき姿であるという理由で再開されます。

2
brokedid

これらの答えはすべて間違っています。リストビューをスクロールビューに入れようとしているのなら、デザインを考え直すべきです。 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;
    }


}

リストアダプタは、表示されているものだけをレンダリングするので、すべてを処理できます。

1
TacoEater

それが不可能だった前に。しかし、新しい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>
1

これは、 @ 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();
}
1
Eng.Fouad

提案された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);

        }
    }
}
}
1

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内にあるため、すべてスクロール可能になります。

1
max4ever

これを試して、これは私のために動作します、私はそれがどこでそれを見つけたのか忘れていました。

    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上でスクロールしていません

1
Bhimbim

この ライブラリは、この問題に対する最も簡単で迅速な解決策です。

0
Kashif Nazar

LinearLayoutがsetAdapterメソッドを持っていれば、この問題は完全に解消されるでしょう。

あなたが実際に他のスクローリングビューの中にスクロールリストビューを望むならば、これは助けにはならないが、そうでなければこれは少なくともあなたに考えを与えるでしょう。

スクロールしたいすべてのコンテンツを組み合わせて、それにListViewのアダプタを設定するためのカスタムアダプタを作成する必要があります。

私は便利なサンプルコードを持っていません、しかしあなたが何かが欲しいなら。

<ListView/>

(other content)

<ListView/>

それからあなたはそのコンテンツのすべてを表すアダプタを作成する必要があります。 ListView/Adaptersは、さまざまなタイプを処理するのに十分スマートですが、アダプタを自分で作成する必要があります。

Android UI APIは、他のほとんどすべてのものほど成熟しているわけではないので、他のプラットフォームと同じ優れた点はありません。また、Android上で何かをするときには、たぶんAndroid(unix)の考え方に従う必要があります。小さな部分の機能を集めてそれを実現するためにあなた自身のコードの束を書かなければならないでしょう作業。

0
majinnaibu

リストビューをScrollview内に配置するのではなく、リストビューとScrollviewのオープンの間の残りのコンテンツを別のビューとして配置し、そのビューをリストビューのヘッダーとして設定します。それであなたは最終的にScrollを担当する唯一のリストビューになるでしょう。

0
Saksham

ListViewScrollViewの中に配置すると、2つの問題が発生します。 1つはScrollViewがUNSPECIFIEDモードでその子を測定するため、ListViewは1つのアイテムのみに対応するように独自の高さを設定し(理由はわかりません)、もう1つはScrollViewがタッチイベントをインターセプトしますListViewはスクロールしません。

しかし、canを使用してListViewScrollViewの内側に配置し、いくつかの回避策を講じます。 この投稿 、私は回避策を説明しています。この回避策により、ListViewのリサイクル機能も保持できます。

0
Durgadass S