快速实现一个滑动显示隐藏面板的ListView
基本用法:
在你的item布局文件中需要有ID为expandable_toggle_button的把手,和ID为expandable的面板容器
典型的像下面这样:
如果你嫌上面的做法麻烦:
还有简单的,使用ActionSlideExpandableListView控件,无需指定具体的把手ID和面板ID;
但是我通常不这样做,因为毕竟使用的是ActionSlideExpandableListView,而不是普通的ListView,扩展性可能会受限制。
附件使用的是ActionSlideExpandableListView控件
基本用法:
listView = (ListView) view.findViewById(R.id.listView); protected void notifyDataSetChanged() { if (adapter == null) { adapter = new CommonAdapter<T>(context, beans, layoutId) { @Override public void setValues(ViewHolder helper, T item, int position) { createItem(helper, item, position); } }; listView.setAdapter(new SlideExpandableListAdapter(adapter, R.id.expandable_toggle_button, R.id.expandable)); } else { adapter.notifyDataSetChanged(); } }
在你的item布局文件中需要有ID为expandable_toggle_button的把手,和ID为expandable的面板容器
典型的像下面这样:
<?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="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="8dp" android:paddingRight="8dp" android:orientation="vertical" > <TextView android:id="@+id/item_0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|start" android:gravity="center" android:singleLine="true" android:text="订单编号" android:textColor="@color/base_black" android:textSize="@dimen/font_middle" /> <TextView android:id="@+id/item_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:gravity="center" android:paddingBottom="8dp" android:paddingTop="8dp" android:singleLine="true" android:text="进场时间" android:textColor="@color/base_black" android:textSize="@dimen/font_middle" /> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="8dp" android:paddingRight="8dp" android:orientation="horizontal" > <TextView android:id="@+id/item_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|start" android:gravity="center" android:singleLine="true" android:text="停车场名称" android:textColor="@color/base_black" android:textSize="@dimen/font_middle" /> <ImageView android:id="@+id/expandable_toggle_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:layout_marginRight="16dp" android:src="@drawable/bg_btn_more" /> </FrameLayout> <LinearLayout android:id="@+id/expandable" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/base_gray" android:orientation="horizontal" > <TextView android:id="@+id/btn_0" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:drawableTop="@drawable/bg_btn_0" android:gravity="center" android:singleLine="true" android:text="取消订单" android:textColor="@android:color/white" android:textSize="@dimen/font_middle" /> <TextView android:id="@+id/btn_1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:drawableTop="@drawable/bg_btn_0" android:gravity="center" android:singleLine="true" android:text="联系对方" android:textColor="@android:color/white" android:textSize="@dimen/font_middle" /> <TextView android:id="@+id/btn_2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:drawableTop="@drawable/bg_btn_0" android:gravity="center" android:singleLine="true" android:text="退订" android:textColor="@android:color/white" android:textSize="@dimen/font_middle" /> <TextView android:id="@+id/btn_3" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:drawableTop="@drawable/bg_btn_0" android:gravity="center" android:singleLine="true" android:text="进场" android:textColor="@android:color/white" android:textSize="@dimen/font_middle" /> </LinearLayout> </LinearLayout>
如果你嫌上面的做法麻烦:
还有简单的,使用ActionSlideExpandableListView控件,无需指定具体的把手ID和面板ID;
但是我通常不这样做,因为毕竟使用的是ActionSlideExpandableListView,而不是普通的ListView,扩展性可能会受限制。
附件使用的是ActionSlideExpandableListView控件
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedData) { super.onCreate(savedData); // set the content view for this activity, check the content view xml file // to see how it refers to the ActionSlideExpandableListView view. this.setContentView(R.layout.single_expandable_list); // get a reference to the listview, needed in order // to call setItemActionListener on it ActionSlideExpandableListView list = (ActionSlideExpandableListView)this.findViewById(R.id.list); // fill the list with data list.setAdapter(buildDummyData()); // listen for events in the two buttons for every list item. // the 'position' var will tell which list item is clicked list.setItemActionListener(new ActionSlideExpandableListView.OnActionClickListener() { @Override public void onClick(View listView, View buttonview, int position) { /** * Normally you would put a switch * statement here, and depending on * view.getId() you would perform a * different action. */ String actionName = ""; if(buttonview.getId()==R.id.buttonA) { actionName = "buttonA"; } else { actionName = "ButtonB"; } /** * For testing sake we just show a toast */ Toast.makeText( MainActivity.this, "Clicked Action: "+actionName+" in list item "+position, Toast.LENGTH_SHORT ).show(); } // note that we also add 1 or more ids to the setItemActionListener // this is needed in order for the listview to discover the buttons }, R.id.buttonA, R.id.buttonB); } /** * Builds dummy data for the test. * In a real app this would be an adapter * for your data. For example a CursorAdapter */ public ListAdapter buildDummyData() { final int SIZE = 40; String[] values = new String[SIZE]; for(int i=0;i<SIZE;i++) { values[i] = "Item "+i; } return new ArrayAdapter<String>( this, R.layout.expandable_list_item, R.id.text, values ); }