Ich habe die StickyListHeaders
Bibliothek in der Vergangenheit verwendet (oder vielmehr versucht, zu verwenden). Nachdem ich einige Probleme damit hatte, kam ich auf Folgendes. Es ist nicht viel anders als was andere Poster vorgeschlagen haben.Die Hauptlayoutdatei activity_layout.xml
besteht aus einer ListView
und einer LinearLayout
, die standardmäßig nicht sichtbar ist. Mit der OnScroll() - Methode des OnScrollListener wird die Sichtbarkeit LinearLayout's
umgeschaltet. Sie müssen kein anderes Layout aufblasen oder Ansichten dynamisch zum übergeordneten Element Ihres Layouts hinzufügen. Dies ist, was die onScroll
Methode wie folgt aussieht:
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > 3) { // 5th row will stick
llHeader.setVisibility(View.VISIBLE);
} else {
llHeader.setVisibility(View.GONE);
}
}
einfach, die Sichtbarkeit schalten Sie den gewünschten Effekt zu erzielen. Sie können sich den folgenden Code ansehen. Es ist ein funktionierendes Beispiel für das, was Sie erwarten können. Die Aktivität enthält eine ListView
mit einer streng Barebone-Erweiterung von BaseAdapter
. Die ListView
ist mit nummerierten Schaltflächen (einer in jeder Zeile, beginnend bei 0 und bis zu 19) bestückt.
public class StickyHeader extends Activity {
LinearLayout llHeader;
ListView lv;
SHAdapter shAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
lv = (ListView) findViewById(R.id.listView1);
llHeader = (LinearLayout) findViewById(R.id.llHeader);
shAdapter = new SHAdapter();
lv.setAdapter(shAdapter);
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > 3) {
llHeader.setVisibility(View.VISIBLE);
} else {
llHeader.setVisibility(View.GONE);
}
}
});
}
public class SHAdapter extends BaseAdapter {
Button btCurrent;
int[] arr = new int[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int arg0) {
return arr[arg0];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = getLayoutInflater().inflate(R.layout.list_item_layout, null);
btCurrent = (Button) convertView.findViewById(R.id.button1);
if ((Integer)getItem(position) == 4) {
btCurrent.setText("Number " + getItem(position) + " is sticky");
} else {
btCurrent.setText("" + getItem(position));
}
return convertView;
}
}
}
activity_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
<!-- This LinearLayout's visibility is toggled -->
<!-- Improvement suggested by user 'ar34z'
(see comment section below) -->
<include layout="@layout/list_item_layout" />
</RelativeLayout>
list_item_layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llHeader"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Ich fand gerade diese Bibliothek: https://github.com/emilsjolander/StickyListHeaders, also werde ich versuchen, dies jetzt, und fügen Sie dann selbst Antwort hinzu, wenn es gut funktioniert. – minhee
Ich fand StickyListHeaders ist nicht geeignet für meinen Job, also habe ich die Frage aktualisiert. – minhee