Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示
来源:互联网 发布:快速移动软件 编辑:程序博客网 时间:2024/04/24 20:22
想必大家在用电脑上网的时候,都会碰到过,文件的显示方式,一般有列表显示,图标显示,等显示方式。当然,android中也有这种显示方式。今天就来一起实现一下。
首先,说一下,刚开始因为项目需求,要有这个列表和网格来回切换显示的功能,没当回事,想着偷懒网上应该挺多,然后,找了大半天发现寥寥无几,唯独的一篇文章是写这个的,但是被转载了多次,都是相同的。可能原文作者只是提供了一个思路罢了,代码给的相当模糊。以至于被模糊的转载了好多次。打开一个连接发现一模一样,就连bug都一样。没办法,还是自己动手,丰衣足食吧。
先来看看实现后的真机效果图:
1.首先,是activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.myfiledemo.MainActivity" > <Button android:id="@+id/btn_select_show" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="切换视图"/> <GridView android:id="@+id/gridview1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:columnWidth="60dp" android:gravity="center" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:padding="10dp" android:stretchMode="columnWidth" android:verticalSpacing="10dp" /> <ListView android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/></LinearLayout>
布局也同样简单,一个ListView,一个GridView,还有一个可点击切换的Button.
这里GridView中的android:numColumns=”auto_fit”属性是根据手机屏幕会系统自动去设置显示列数,可适配平板。好了,关于GridView的使用属性,不是本篇博客的重点,想要了解的可自行查阅学习。
-
2.items.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" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView"/></LinearLayout>
items.xml也很简单,不知道你们都叫这个文件什么,我本人习惯叫模版
-
3.ManiActivity.java中
package com.example.myfiledemo;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.GridView;import android.widget.ListView;import android.widget.Toast;/** * 视图切换 列表 网格 * @author NanFeiLong * */public class MainActivity extends Activity implements OnClickListener, OnItemClickListener { private boolean isShowView = true; private GridView mGridView; private ListView mListView; private ArrayList<MyBean> mArrayList; private Button mBtnSelectShow; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.listview1); mGridView = (GridView) findViewById(R.id.gridview1); mBtnSelectShow = (Button) findViewById(R.id.btn_select_show); initdata();// 数据 mBtnSelectShow.setOnClickListener(this); adapter = new MyAdapter(this, mArrayList); setLayout(); } /** * 添加数据 */ private void initdata() { // TODO Auto-generated method stub mArrayList = new ArrayList<MyBean>(); for (int i = 0; i < 20; i++) { mArrayList.add(new MyBean("项目"+i, R.drawable.format_folder)); } } /** *实现切换视图 */ private void setLayout() { if (isShowView) { if (mGridView == null) { mGridView = (GridView) findViewById(R.id.gridview1); } mGridView.setVisibility(View.VISIBLE); mGridView.setAdapter(adapter); mGridView.setOnItemClickListener(this); mListView.setVisibility(View.GONE); mGridView.setSelection(0); isShowView = !isShowView; } else { if (mListView == null) { mListView = (ListView) findViewById(R.id.listview1); } mListView.setVisibility(View.VISIBLE); mListView.setAdapter(adapter); mListView.setOnItemClickListener(this); mGridView.setVisibility(View.GONE); mListView.setSelection(0);//可将第一个item对我们可见显示,用于错乱,也可以不要 isShowView = !isShowView; } } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_select_show: setLayout(); break; default: break; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub switch (parent.getId()) { case R.id.gridview1: Toast.makeText(MainActivity.this, "gridview-" + mArrayList.get(position).getIconName(), Toast.LENGTH_SHORT).show(); break; case R.id.listview1: Toast.makeText(MainActivity.this, "listview-" + mArrayList.get(position).getIconName(), Toast.LENGTH_SHORT).show(); break; default: break; } }}
可以看到其中的一个核心方法setLayout()是实现的重点所在,当onCreate时候执行一次setLayout()方法,让其只显示一个,然后是每当点击一次button会执行一次setLayout()方法,显示就会在列表和网格视图之间切换一次,在其中我们设置了一个flag,isShowView。当setLayout()的最后利用isShowView = !isShowView;给其肤质,这样就会来回切换啦。
4. MyAdapter.java
package com.example.myfiledemo;import java.util.ArrayList;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;/** * 自定义BaseAdapter * @author NanFeiLong * */public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater = null; private Context mContext; private ArrayList<MyBean> mArrayList = null; public MyAdapter(Context context, ArrayList<MyBean> arrayList) { mContext = context; mArrayList = arrayList; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return mArrayList == null ? 0 : mArrayList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mArrayList == null ? null : mArrayList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = null; MyBean mBean = (MyBean) getItem(position); if (convertView == null) { convertView = mInflater.from(mContext).inflate(R.layout.items, parent, false); holder = new ViewHolder(); holder.imageView = (ImageView) convertView.findViewById(R.id.imageView1); //holder.imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); holder.textView = (TextView) convertView.findViewById(R.id.textView1); //注意这里是个坑,如果写在这里的话,listview中会出现item重复显示的bug, //本人当时由于写错了,在这里走了冤枉了,望读者能注意 //holder.imageView.setImageResource(mBean.getImageId()); //holder.textView.setText(mBean.getIconName()); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.imageView.setImageResource(mBean.getImageId()); holder.textView.setText(mBean.getIconName()); return convertView; } class ViewHolder { ImageView imageView; TextView textView; } }
5.最后还有一个自己定义的实体类MyBean.java,用于存储imageView和textView,
package com.example.myfiledemo;/** * 实体类 * @author NanFeiLong * */public class MyBean { private String iconName; private int imageId; public MyBean(String iconName, int imageId) { super(); this.iconName = iconName; this.imageId = imageId; } public String getIconName() { return iconName; } public void setIconName(String iconName) { this.iconName = iconName; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } @Override public String toString() { return "MyBean [iconName=" + iconName + ", imageId=" + imageId + ", getIconName()=" + getIconName() + ", getImageId()=" + getImageId() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]"; }}
6.至此,算是结束了,运行之后,会出现如图的效果
拓展一下,实际项目中,有可能列表布局和网格布局的items.xml都不同,可能还 有其他不同,这样的情况,可以写两个items.xml。虽然代码比较多,但是都是相同的。然后在setLayout()方法显示每一个的时候,在去new相对应的adapter。这里给出我自己项目中的一个实际应用
private void setLayout() { // TODO Auto-generated method stub if (isShowListView) { if (fileLv == null) { fileLv = (ListView) findViewById(R.id.listview); } fileLv.setVisibility(fileLv.VISIBLE); fileLv.setOnItemClickListener(this); fileGv.setVisibility(fileGv.GONE); sAdapter = new SimpleAdapter(this, aList, R.layout.listview_item, new String[] { "fImg", "fName", "fInfo" }, new int[] { R.id.file_img, R.id.file_name, R.id.file_info }); fileLv.setAdapter(sAdapter); isShowListView = !isShowListView; } else { if (fileGv == null) { fileGv = (GridView) findViewById(R.id.gridview); } fileGv.setVisibility(fileGv.VISIBLE); fileGv.setOnItemClickListener(this); fileLv.setVisibility(fileLv.GONE); sAdapter = new SimpleAdapter(this, aList, R.layout.gridview_item, new String[] { "fImg", "fName" }, new int[] { R.id.iv_gridview, R.id.tv_name_gridview }); fileGv.setAdapter(sAdapter); isShowListView = !isShowListView; } }
好了,到这里应该都没有疑问了。洗洗睡觉咯,祝各位大神好梦O(∩_∩)O~
源码
- Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示
- 【iOS干货】:列表和网格视图的相互切换
- android列表视图切换:GridView和ListView两种方式来显示一个列表
- android列表视图切换:GridView和ListView两种方式来显示一个列表
- Android中GridView网格视图
- android学习之--网格视图(GridView)和图像切换器(ImageSwitcher)
- Android 网格视图GridView
- android gridview网格视图
- Android之ListView列表视图和界面跳转实现
- Android中利用ViewPager实现视图切换
- Android中利用ViewPager实现视图切换
- android 网格视图 GridView 通过SimpleAdapter实现
- 实现类似Android的网格效果的列表视图
- ListView列表视图的介绍和使用
- 列表视图ListView和ListActivity
- android 控件 网格视图(GridView)
- Android—Gridview(网格视图)
- Android 网格视图(GridView) 实践
- 五、servelet处理中文乱码,sendRedirect和forward区别
- IDEA Spring-boot-devTools 无效解决办法
- VS2013环境下64位整数乘法Debug
- 从恒大淘宝队,看马云的足球经济学
- 微信小程序开发教程
- Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示
- 整理jdk连接Oracle
- Android RadioGroup
- 由SpringMVC实现文件上传,前端基于easyui
- 从恒大淘宝队,看马云的足球经济学
- javascript的数据类型
- java中,引用对象时常遇到的问题
- php+jquery+ajax+json的一个最简单实例
- Chromium CEF as a HTML-Editor