效果
收缩
展开
思路
通过Button的点击事件来改变Adapter中的数据,然后来更新视图
代码
- Activity
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.keith.test.R;
import java.util.ArrayList;
import java.util.List;
public class TestActivity extends AppCompatActivity {
//收缩时显示的行数
private static final int SHOWED_LINES = 2;
//GridView的列数
private static final int NUM_COLUMNS = 4;
private List<String> mlist;
private List<String> mList;
private List<String> mList2;
//是否收缩标志,默认收缩
private boolean mIsShrink = true;
private GridView mGridView;
//收缩和展开按钮
private Button mToggle;
private BaseAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mGridView = (GridView) findViewById(R.id.gv);
mToggle = (Button) findViewById(R.id.btn_loadmore);
mList = new ArrayList();
mList2 = new ArrayList();
//初始化数据
for (int i = 0; i < 21; i++) {
mList.add("mList - " + i);
}
for (int i = 0; i < NUM_COLUMNS * SHOWED_LINES; i++) {
mList2.add(mList.get(i));
}
//默认收缩
mlist = mList2;
//初始化Adapter
mAdapter = new BaseAdapter() {
@Override
public int getCount() {
return mlist.size();
}
@Override
public Object getItem(int position) {
return mlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
v = LayoutInflater.from(TestActivity.this).inflate(R.layout.item_gv, null);
TextView tv = (TextView) v.findViewById(R.id.item_txt_gv);
tv.setText(mlist.get(position));
return v;
}
};
//绑定Adapter
mGridView.setAdapter(mAdapter);
mToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mIsShrink) {
expand();
} else {
collapse();
}
//每次点击都要调用
setListViewHeightBasedOnChildren(mGridView);
}
});
//第一次调用
setListViewHeightBasedOnChildren(mGridView);
}
//展开
private void expand() {
mlist = mList;
mAdapter.notifyDataSetChanged();
mToggle.setText("收起");
mIsShrink = false;
}
//收缩
private void collapse() {
for (int i = 0; i < 8; i++) {
mlist = mList2;
}
mAdapter.notifyDataSetChanged();
mToggle.setText("更多");
mIsShrink = true;
}
/**
* 当GridView外层有ScrollView时,需要动态设置GridView高度
*
* @param gridview
*/
protected void setListViewHeightBasedOnChildren(GridView gridview) {
if (gridview == null) return;
ListAdapter listAdapter = gridview.getAdapter();
if (listAdapter == null) return;
int totalHeight;
//向上取整
int count = (int) Math.ceil(listAdapter.getCount() / 4.0);
//获取一个子view
View itemView = listAdapter.getView(0, null, gridview);
//测量View的大小
itemView.measure(0, 0);
totalHeight = itemView.getMeasuredHeight();
ViewGroup.LayoutParams params = gridview.getLayoutParams();
//设置GridView的布局高度
params.height = totalHeight * count;
gridview.setLayoutParams(params);
}
}
主布局 activity_test.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <GridView android:id="@+id/gv" android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="4" /> <TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="#000000" /> <Button android:id="@+id/btn_loadmore" android:layout_width="match_parent" android:layout_height="32dp" android:background="#00000000" android:gravity="center" android:text="更多" android:textSize="14sp" /> </LinearLayout> </ScrollView> </RelativeLayout>
GridView子布局 item_gv.xml
<?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="match_parent" android:orientation="vertical"> <TextView android:id="@+id/item_txt_gv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="test" android:textColor="#00FF00" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout>