Użyłem (a raczej próbowałem użyć) biblioteki StickyListHeaders
w przeszłości. Po kilku problemach wymyśliłem następujące. To niewiele różni się od tego, co sugerowały inne plakaty.
Główny plik układu activity_layout.xml
składa się z ListView
i LinearLayout
, który jest domyślnie niewidoczny. Przy użyciu metody OnScrollListener onScroll() widoczność LinearLayout's
jest przełączana. Nie ma potrzeby nadmuchiwania innego układu ani dynamicznego dodawania widoków do elementu nadrzędnego układu. To właśnie metoda onScroll
wygląda następująco:
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);
}
}
Po prostu przełączyć widoczność, aby uzyskać pożądany efekt. Możesz rzucić okiem na poniższy kod. Jest dobrym przykładem tego, czego możesz się spodziewać. Ta aktywność zawiera plik ListView
o ściśle rozszerzonym kodzie z numerem BaseAdapter
. ListView
jest zapełniany numerowanymi przyciskami (po jednym w każdym wierszu, zaczynając od 0 i przechodząc do 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>
Właśnie znalazłem tej biblioteki: https://github.com/emilsjolander/StickyListHeaders, więc postaram teraz, a następnie dodaj odpowiedź sam, jeśli działa dobrze. – minhee
Znalazłem StickyListHeaders nie nadaje się do mojej pracy, więc zaktualizowałem pytanie. – minhee