Sie erstellen eine benutzerdefinierte Listenansicht, die nicht scrollbar ist
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();
}
}
In Ihrer Layout-Ressourcendatei
<?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.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" >
</RelativeLayout>
</RelativeLayout>
</ScrollView>
In der Java-Datei
Erstellen Sie ein Objekt Ihrer customListview anstelle von ListView wie folgt:
NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
(ListView)
sollten weiterhin einwandfrei funktionieren.NonScrollListView
die ElternScrollView
an die Spitze der gescrollt wirdNonScrollListView
, anstatt der Spitze derScrollView
. (Der Benutzer muss bis zu denScrollView
Inhalten scrollen , die vor dem stehenNonScrollListView
.) Dies geschieht fürEXACTLY
undAT_MOST
Messmodi und für jede ganzzahlige Höhe, die ammakeMeasureSpec()
UNSPECIFIED
,ScrollView
bleibt der Elternteil bei Bildlauf Y = Null (das erwartete Verhalten). Offensichtlich zeigt derNonScrollListView
in diesem Fall jedoch nicht den gesamten Inhalt an.Es ist überhaupt nicht erforderlich, ein
listview
zu verwenden.Wenn Sie wirklich darüber nachdenken,
listview
kann aLinearLayout
in Ihrem Fall durch a ersetzt werden. DasAdapter
wäre das gleiche, aber anstatt den Adapter mit Ihrem zu verbindenlistview
, rufen Sie einfach diegetView
Funktion des Adapters in einer for-Schleife für Ihre Daten auf und fügen Sie die abgerufenen Ansichten Ihrer Vertikalen hinzulinearlayout
.Dieser Ansatz wird jedoch nur empfohlen, wenn Ihre Liste eine kleine Anzahl von Elementen enthält und Ihre Anzeigedarstellung dieser Elemente nicht speicherintensiv ist.
quelle
LinearLayout
ist kein fairer Ersatz für denListView
Fall, dass Sie die Güte dahinter nutzen möchtenAbsListView.CHOICE_MODE_MULTIPLE_MODAL
- um eine Neuerfindung des Rades zu vermeiden,NonScrollListView
Der beste Weg, dies zu tun (im Jahr 2017), ist die Verwendung von a
RecyclerView
mit aNestedScrollView
.Keine Hacks erforderlich und es funktioniert sofort so, wie Sie es möchten.
quelle
The problem is that I don't want the ListViews to be scrollable
Nun, es gibt einen coolen Android-Typ namens Mark Murphy alias CommonsWare, der eine sehr nützliche Komponente namens CWAC Merge Adapter erstellt hat , mit der Sie tun können, was Sie brauchen. Sie müssen die Ansichten dynamisch und nicht aus XML hinzufügen. Aber angesichts Ihrer einfachen Benutzeroberfläche sollte das kein Problem sein. Ich verwende es für solche Fälle, in denen ich keine Ahnung habe, welche Art von Daten ich scrollen soll.
Wenn Sie wollen , dass es nicht verwenden (aus Gründen , die Lizenzierung vielleicht), können Sie ein einzelnes Listview haben es (anstelle dieser zwei aufeinander folgenden Listenansichten) und überschreiben
getItemViewsCount
,getItemViewType
undgetView
um über das Layout zu geben. Wenn Sieandroid listview different rows
bei Google suchen, finden Sie nützliche Informationen. Zum Beispiel dieser Link oder dieser .Ich würde mich jedoch für einen Merge-Adapter entscheiden.
quelle
Ich habe eine einfache Lösung, wenn es möglich ist, die Höhe / Breite Ihres Elements zu berechnen ... Sie müssen nur ein übergeordnetes lineares Layout von ListView erstellen und dann die übergeordnete Höhe von Java aus festlegen.
Angenommen, Sie müssen diese Ansicht entwerfen ... Jetzt wird die Größe des übergeordneten Layouts aus Java definiert ...
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); }
das ist alles :)
quelle
Wählen Sie die ListView aus, für die Sie einen Bildlauf durchführen möchten, und fügen Sie anschließend die Methode 'setOnTouchListener' hinzu, damit das System den Bildlauf automatisch in die ListView einfügt
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);
Ich hoffe das funktioniert bei dir
quelle