Ho usato (o piuttosto provato a usare) la libreria StickyListHeaders
in passato. Dopo aver avuto alcuni problemi con esso, ho trovato il seguente. Non è molto diverso da quello che altri poster hanno suggerito.
Il file di layout principale activity_layout.xml
è costituito da un ListView
e un LinearLayout
che è invisibile per impostazione predefinita. Utilizzando il metodo onScroll() di OnScrollListener, la visibilità dello LinearLayout's
è attivata. Non è necessario gonfiare un altro layout o aggiungere viste dinamicamente al genitore del proprio layout. Questo è ciò che il metodo onScroll
assomiglia:
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);
}
}
Semplicemente, commutare la visibilità per ottenere l'effetto desiderato. Puoi dare un'occhiata al seguente codice. È un esempio funzionante di ciò che puoi aspettarti. L'attività contiene uno ListView
con un'estensione rigorosamente barebone di BaseAdapter
. Il numero ListView
è popolato con pulsanti numerati (uno su ogni riga, a partire da 0 e fino a 19).
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>
Ho appena trovato questa libreria: https://github.com/emilsjolander/StickyListHeaders, quindi cercherò questo ora, e quindi aggiungi risposta io stesso se funziona bene. – minhee
Ho trovato che StickyListHeaders non è adatto per il mio lavoro, quindi ho aggiornato la domanda. – minhee