GridView简单封装收缩和展开

来源:互联网 发布:艾可萨兽数据 编辑:程序博客网 时间:2024/06/06 19:23

效果

收缩
这里写图片描述
展开
这里写图片描述

思路

通过Button的点击事件来改变Adapter中的数据,然后来更新视图

代码

  1. 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);    }}
  1. 主布局 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>
  2. 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>
0 0