GridView简单封装收缩和展开

该博客介绍了如何在Android中使用GridView实现一项功能,即通过点击按钮动态地对GridView的内容进行收缩和展开操作。核心思路是通过监听Button的点击事件,根据状态修改Adapter的数据,进而刷新视图。示例代码包括Activity和GridView的子布局XML文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果

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

思路

通过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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值