android gridview,android的:tableLayout和gridview有什么不同
android gridview,android的:tableLayout和gridview有什么不同详细介绍
本文目录一览: Android开发中,加载本地文件夹下所有图片并显示在GridView中
这个工程相对复杂一点,一点一点来解释。
注意,这里的gridview一定要先设置好id以及列数。
在Activity中初始化,这个就简单了。
首先,我们写一个获取本地文件的帮助类。
此类中包含两个方法,第一个方法需要传入一个String类型的文件夹路径,会返回一个给定路径中图片的全名称(包括扩展名)。
第二个方法是用于过滤文件夹下的图片文件。
然后,在Activity中调用上面的方法,传入一个需要遍历的文件夹路径。
将返回的图片全名和给定的路径拼接成资源路径,放进一个String类型的数组里面。
首先,我们新建一个javaBean类,用于结构化我们获取的图片数据。
一个title,一个imageId。
然后,到了最关键的一步,重写适配器类。
构造方法里需要传入三个参数,titles数组,imageId数组,以及当前上下文。
当然,gridView的item布局文件我们不能忘记。
之后就是继承BaseAdapter,重写适配器了。
android ScrollVIew中嵌套GridView,如何显示GridView
在Android开发当中经常会用到了需要ScrollView嵌套GridView或者是ListView的情况,由于这两款控件都自带滚动条,当他们一起使用的时候就会出现GridView或ListView会显示不全的问题。
自定义MyGridView
public class MyGridView extends GridView {
public MyGridView(Context context) {
super(context);}
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);}@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);}}xml中的布局文件:
<com.xxx.mygridview
android:id=@+id/mygridview
android:layout_width=fill_parent
android:layout_height=wrap_content
android:gravity=center
android:horizontalSpacing=5dp
android:numColumns=4
android:stretchMode=columnWidth
android:verticalSpacing=6dp /
Java调用代码
GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。主要用于设置Adapter。
1.GridView常用的XML属性
属性名称 描述
android:columnWidth 设置列的宽度。
android:gravity 设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical可以多选,用“|”分开。
android:horizontalSpacing 两列之间的间距。
android:numColumns 设置列数。
android:stretchMode 缩放模式。
android:verticalSpacing 两行之间的间距。
2.实例1
main.xml
运行效果:
3.实例2
gridview.xml
grid_item.xml
运行效果图:
4.实例3
main.xml
picture_item.xml
效果图:
</com.xxx.mygridview
android gridview怎么做表格
功能:做表格,根据每个单元格的不同含义,给单元格设置不同的背景色;
实现:通过GridView结合BaseAdapter实现;
案例源码:
第一步,新建一个Android应用:BaseAdapterDemoActivity;
第二部,重写main.xml,如下:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<gridview
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
第三步,在BaseAdapterDemoActivity.java文件中创建MyAdapter,基类是BaseAdapter,如下:
package hello.zcping.adapter;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.TextView;
public class BaseAdapterDemoActivity extends Activity {
private GridView mGridView;
private MyAdapter mMyAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
public void setupViews() {
mMyAdapter = new MyAdapter();
mGridView = (GridView) findViewById(R.id.gridview);
mGridView.setAdapter(mMyAdapter);
mGridView.setNumColumns(5);
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int arg0) {
return arg0;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView mTextView = new TextView(getApplicationContext());
String[] abc = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
int[] icolor = { Color.GRAY, Color.GREEN, Color.RED, Color.WHITE,
Color.YELLOW, Color.GRAY, Color.GREEN, Color.RED,
Color.WHITE, Color.YELLOW, Color.GRAY, Color.GREEN,
Color.RED, Color.WHITE, Color.YELLOW, Color.GRAY,
Color.GREEN, Color.RED, Color.WHITE, Color.YELLOW };
mTextView.setText(abc[position]);
mTextView.setTextColor(Color.BLACK);
mTextView.setBackgroundColor(icolor[position]);
return mTextView;
}
}
}
效果如下:
android GridView 如何设置为左右可滚动?
上下空间大,还可以滚动,只要设置:mGridView .setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e("onTouch", "MotionEvent.ACTION_MOVE"); return MotionEvent.ACTION_MOVE == event.getAction() ? true : false; } });这样,就不能上下滚动了
直接上代码
package com.example.horizontallistview;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
/***
*
* @author ymw
* @summary 博客地址欢迎访问: http://www.cnblogs.com/_ymw
*/
public class MainActivity extends Activity {
List
cityList;
RelativeLayout itmel;
GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater layoutInflater = (LayoutInflater) this
.getSystemService("layout_inflater");
gridView = (GridView) findViewById(R.id.grid);
setData();
setGridView();
}
/**设置数据*/
private void setData() {
cityList = new ArrayList
();
CityItem item = new CityItem();
item.setCityName("深圳");
item.setCityCode("0755");
cityList.add(item);
item = new CityItem();
item.setCityName("上海");
item.setCityCode("021");
cityList.add(item);
item = new CityItem();
item.setCityName("广州");
item.setCityCode("020");
cityList.add(item);
item = new CityItem();
item.setCityName("北京");
item.setCityCode("010");
cityList.add(item);
item = new CityItem();
item.setCityName("武汉");
item.setCityCode("027");
cityList.add(item);
item = new CityItem();
item.setCityName("孝感");
item.setCityCode("0712");
cityList.add(item);
cityList.addAll(cityList);
}
/**设置GirdView参数,绑定数据*/
private void setGridView() {
int size = cityList.size();
int length = 100;
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float density = dm.density;
int gridviewWidth = (int) (size * (length + 4) * density);
int itemWidth = (int) (length * density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
gridviewWidth, LinearLayout.LayoutParams.FILL_PARENT);
gridView.setLayoutParams(params); // 设置GirdView布局参数,横向布局的关键
gridView.setColumnWidth(itemWidth); // 设置列表项宽
gridView.setHorizontalSpacing(5); // 设置列表项水平间距
gridView.setStretchMode(GridView.NO_STRETCH);
gridView.setNumColumns(size); // 设置列数量=列表集合数
GridViewAdapter adapter = new GridViewAdapter(getApplicationContext(),
cityList);
gridView.setAdapter(adapter);
}
/**GirdView 数据适配器*/
public class GridViewAdapter extends BaseAdapter {
Context context;
List
list;
public GridViewAdapter(Context _context, List
_list) {
this.list = _list;
this.context = _context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.list_item, null);
TextView tvCity = (TextView) convertView.findViewById(R.id.tvCity);
TextView tvCode = (TextView) convertView.findViewById(R.id.tvCode);
CityItem city = list.get(position);
tvCity.setText(city.getCityName());
tvCode.setText(city.getCityCode());
return convertView;
}
}
public class CityItem {
private String cityName;
private String cityCode;
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getCityCode() {
return cityCode;
}
public void setCityCode(String cityCode) {
this.cityCode = cityCode;
}
}
}
学习了,不过左右滚动,上下的空间好大,不知道怎么控制。
GridView不支持左右滚动。
左右滚动的需求可考虑:
在外层加一个HorizontalScrollView, 不过这种滑动体验并不好,上下左右均可滑动,如果是斜着滑的时候,体验差。当然,如果你会自定义HorizontalScrollView把滑动区分为斜着上下滑和斜着左右滑,再把斜着上下滑的事件传递给子View也是可以的。
可以考虑Viewpager里加载多个GridView,这样GridView就可以一页一页的滑
怎样动态设置GridView的宽和高(Android)
LinearLayout.LayoutParams linearParams2 = (LinearLayout.LayoutParams)liveGrid.getLayoutParams();
linearParams2.width=(shipin_Adapter.getCount())*(cWidth+hSpacing);
linearParams2.height=cHight;
liveGrid.setLayoutParams(linearParams2);
以下两种方式都可以做到:
一、在xml布局文件中设置,wrap_content即表示根据gridView的内容自使用宽高,代码如下:
android:layout_width="wrap_content" android:layout_height="wrap_content" 二、在代码中动态设置,可以在对gridview赋值之后,计算gridview的宽高,然后进行设置:
int height = 20;//此处的高度需要动态计算 int width = 30;//此处的宽度需要动态计算 LinearLayout.LayoutParams linearParams =new LayoutParams(width, height);gridview.setLayoutParams(linearParams); //使设置好的布局参数应用到控件
需要注意的是:如果你的gridview是嵌套在ScrollView中,那么,你需要重写gridview控件,不然gridview只显示一行的问题(即高度不够),具体重写方式,可以参考下面代码:
/** * @author hnbcinfo * 自定义GridView控件,解决在ListView 或ScrollView中使用GridView导致GridView显示不全的问题 * 当前应用:时间轴中,图片显示 */public class GridViewForScrollView extends GridView { public GridViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public GridViewForScrollView(Context context) { super(context); } public GridViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
为什么android gridview只能显示一行数据
因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。如下:
public class NoScrollGridView extends GridView {
public NoScrollGridView(Context context) {
super(context);
}
public NoScrollGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
ListView也同理。
还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:
/**
* 重新计算listView高度
* @param listView
*/
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);
因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(...GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:
/**
* 计算gridview高度
* @param gridView
*/
public static void setGridViewHeightBasedOnChildren(GridView gridView) {
// 获取GridView对应的Adapter
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
return;
}
int rows;
int columns = 0;
int horizontalBorderHeight = 0;
Class
clazz = gridView.getClass();
try {
// 利用反射,取得每行显示的个数
Field column = clazz.getDeclaredField("mRequestedNumColumns");
column.setAccessible(true);
columns = (Integer) column.get(gridView);
// 利用反射,取得横向分割线高度
Field horizontalSpacing = clazz
.getDeclaredField("mRequestedHorizontalSpacing");
horizontalSpacing.setAccessible(true);
horizontalBorderHeight = (Integer) horizontalSpacing.get(gridView);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
// 判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
if (listAdapter.getCount() % columns > 0) {
rows = listAdapter.getCount() / columns + 1;
} else {
rows = listAdapter.getCount() / columns;
}
int totalHeight = 0;
for (int i = 0; i < rows; i++) { // 只计算每项高度*行数
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight + horizontalBorderHeight * (rows - 1);// 最后加上分割线总高度
gridView.setLayoutParams(params);
}
这样我们就可以在ListView中添加GridView了。。。
注:两个SrcollView型的控件可以是:
;
;
;
;
;
;
;
;
;
... ...
android的:tableLayout和gridview有什么不同
tablelayout是表格布局,表是一行行的,在tablerow里边写多少东西,这一行就有多少东西,但是每行不一定非要相同;但是gridview是网格,每行有几个是自己定义了,一旦定义好了以后,每行的内容及数量一定相等;而且gridview可以看到线条,但是tablelayout不会,没有线条
我来补充:tablelayout是个布局(继承ViewGroup),可以在里面放View。
gridview是继承AbsListView的,和ListView很像,理解成是个View就行了。
tableLayout是表格布局,用的比较少,实现如下图所示效果
注:TableLayout用的比较少,目前android support v7里面有一个gridlayout,它比TabLayout更容易使用,使用更强大,可以试试
GridView 实现网格布局,比如android手机桌面应用程序的排列,就可以用GridView来实现,具体效果如下:
android的gridview 怎么控制其高度
这个有两种方式:
1.layout 布局文件中设置
android:layout_height = "20dp"
2.继承GridView,重写onMeasure方法
经典例子 http://blog.chengyunfeng.com/?p=444
就你这个问题,我专门研究了下,呵呵,共同学习嘛
在Gridview的java文件中有个SimpleAdapter吧,里面有个界面布局文件,比如cell.xml,改一下里面的值,同时main.xml中的android:horizontalSpacing 的值改下,看效果。如果解决了,有更好的办法,记得也告诉我一声哈,共同学习,嘻嘻~
1,控制其控件的总体高度,可以通过布局直接设置layout_height,也可以动态赋值给他,但我相信楼主问的不是这个。
2,控制每个单元的高度。由于gridview没有直接set单元高度的函数,而gridview是根据adapter动态生成的,所以一般在adapter的getView方法中得到(该方法返回的View的高度),在这里处理即可。
如何实现android中横向滚动的gridView
法1.直接用tablelayout gridview是根据你每行的单元数自动生成的行数;
法2.可以在代码里根据view数来动态设置列数,比如有10记录可以设置列数为10/3+1,这样就有三行四列了。
如果您对我的回答有不满意的地方,还请您继续追问;
答题不易,互相理解,互相帮助!
法1.直接用tablelayout gridview是根据你每行的单元数自动生成的行数;
法2.可以在代码里根据view数来动态设置列数,比如有10记录可以设置列数为10/3+1,这样就有三行四列了。
如果您对我的回答有不满意的地方,还请您继续追问;
答题不易,互相理解,互相帮助!
1.直接用tablelayout gridview是根据每行的单元数自动生成的行数;
2.可以在代码里根据view数来动态设置列数,比如有10记录可以设置列数为10/3+1,这样就有三行四列了。
1、动态布局,用横向的scrollview来代替https://github.com/zhilaizhang/Horizontalscrollview
2、动态布局,用横向的Listview来代替
https://github.com/kk-java/HorizontalListView
3、直接使用自定义组件
https://github.com/yinglovezhuzhu/HorizontalGridView
(链接中为github工程,可以自己下载下来学习。)
你可以去看看这个 http://www.cnblogs.com/_ymw/p/4147163.html
法1.直接用tablelayout gridview是根据你每行的单元数自动生成的行数;
法2.可以在代码里根据view数来动态设置列数,比如有10记录可以设置列数为10/3+1,这样就有三行四列了。
如果您对我的回答有不满意的地方,还请您继续追问;
答题不易,互相理解,互相帮助!
如何设置 android gridview 怎么设置 , 一些item可以点击,另外.....
我的意思是比如 我让gridview 的第一个item可以点击 第二个不可以点击
<asp:linkbutton id="LinkButton2" runat="server" enabled="false" causesvalidation="False" commandname="Update"
Text="修改">
<asp:linkbutton id="LinkButton1" runat="server" causesvalidation="False" commandname="Delete"
OnClientClick='return confirm("您真的要删除这条记录吗?若执行此操作,项目涉及的月报及年度信息将会同时删除!")' Text="删除">
这样很简单,如果你想实现点击listview的item中的空白地方(不是gridview)响应listviewitem点击事件,那就把listview的item布局中gridview的的宽度调整为wrap_content就可以了,这样你在点击空白地方的时候不会响应gridview控件上的事件了。
在getView()里判断
if(getItem()==2){
viewholder.button.setOnClickListener(lisener);
}
这个要在代码中进行设置,基本上有两种方式:
在GridView所在的 activity(或者fragment)中, 找到该View,监听点击事件:
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { //点击item触发,进行判断,如果需要处理点击,就进行处理,否则,什么也不做 if(/*处理点击条件*/){ //要做的事 } }});在自己写的GridView对应的适配器中(一般继承于BaseAdapter)的getView中进行判断,如果是需呀处理的item, 就调用setOnClickListener,并定义相应的点击事件,否则可以不绑定点击事件。