为了账号安全,请及时绑定邮箱和手机立即绑定

发现用这个控件滑动图片好卡啊

有什么解决办法吗,真机调试也是卡

正在回答

5 回答

采纳我啊 - -

0 回复 有任何疑惑可以回复我~

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder;

if(convertView==null){

viewHolder=new ViewHolder();

convertView=myInflater.inflate(R.layout.activity_main, null);

viewHolder.image.setBackgroundResource(src[position%src.length]);

viewHolder.image.setLayoutParams(new Gallery.LayoutParams(200, 200));//缩略图的宽和高

viewHolder.image.setScaleType(ScaleType.FIT_XY);//缩放模式,横向缩放

convertView.setTag(viewHolder);

}else {

viewHolder=(ViewHolder) convertView.getTag();

}

return convertView;

}

class ViewHolder{

public ImageView image;

}


0 回复 有任何疑惑可以回复我~
#1

元素滴3579866 提问者 回复 ziom

我已经发过去了,麻烦看看啊,这样写了不能启动,崩溃了,因为之前特意去看了下BaseAdapter那个教程,里面用的是listView作为例子,我以为差不多呢
2016-08-21 回复 有任何疑惑可以回复我~
#2

ziom 回复 元素滴3579866 提问者

适配器的构造里没给context赋值,所以导致了空指针。还有你的布局写得不是一般的糟糕,Gallery的宽为甚么不填充父容器?我说上面的Gallery怎么一运行只显示第一张图,就算这只是一个练习也不能这么草率啊。至于你原先说的滑动卡慢问题我没遇到,你最开始的写法和现在的ViewHolder方式我都试过,效果无差异,都不卡。我用真机测的,我手里现在的这个华为机子也有些年头了,并不是特别好。
2016-08-21 回复 有任何疑惑可以回复我~
#3

元素滴3579866 提问者 回复 ziom

改了一下好了,能发下你用ViewHolder写的吗,至于那个Gallery宽没写填满父容器,我是想试试卡顿会不会好点,这个有什么讲究吗,还是说Gallery的宽必须填满父容器啊
2016-08-21 回复 有任何疑惑可以回复我~
#4

元素滴3579866 提问者 回复 ziom

其实并不是卡顿,是滑动的时候感觉没系统自带的相册那么流畅23333
2016-08-21 回复 有任何疑惑可以回复我~
#5

ziom 回复 元素滴3579866 提问者

没什么讲究的,都是看需求,只是演示案例很少有这么写的。Gallery也过时了,你当练练手就好了,不用太花功夫去深究。慕课网有个万能适配器的课程,推荐你去看一下,或者直接去看那位老师的博客
2016-08-21 回复 有任何疑惑可以回复我~
#6

元素滴3579866 提问者 回复 ziom

好的,谢谢啦
2016-08-21 回复 有任何疑惑可以回复我~
#7

ziom 回复 元素滴3579866 提问者

要谢就多给我几个采纳,有点眼熟你,刚才点你头像看了一下,发现我回答过你好多问题,你都没有采纳 - -
2016-08-21 回复 有任何疑惑可以回复我~
查看5条回复

自定义的适配器要优化,自定义内部类ViewHolder,然后重写getView()方法

0 回复 有任何疑惑可以回复我~
#1

元素滴3579866 提问者

我去学习学习
2016-08-19 回复 有任何疑惑可以回复我~
#2

元素滴3579866 提问者

能帮我看下哪里有问题吗,崩溃了,代码,贴在下面了
2016-08-21 回复 有任何疑惑可以回复我~
public class ImageAdapter extends BaseAdapter{
	private int[]src;
	private Context context;
 public ImageAdapter(int[]src,Context context) {
		this.context=context;
		this.src=src;
	}
//返回数据源的数量
//	无限循环显示图片
	public int getCount() {
		return Integer.MAX_VALUE;
	}
//告诉适配器取得目前容器中数据Id和对象
	@Override
	public Object getItem(int arg0) {
		// TODO 自动生成的方法存根
		return src[arg0];
	}

	@Override
	public long getItemId(int position) {
		// TODO 自动生成的方法存根
		return position;
	}
//取得目前欲显示的图像View,传入数组ID值对图像进行返回
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView image=new ImageView(context);//由于这里没有Activity所以在构造函数里返回上下文
		//image.setBackgroundResource(src[position]);加载对象资源		
		//无限循环时加载的图片的指数position肯定会超过设定的数量,所以做求余处理
		image.setBackgroundResource(src[position%src.length]);		
		image.setLayoutParams(new Gallery.LayoutParams(200, 200));//缩略图的宽和高
		image.setScaleType(ScaleType.FIT_XY);//缩放模式,横向缩放
		return image;
	}
}
public class MainActivity extends Activity implements OnItemSelectedListener,ViewFactory{
private Gallery gallery;
private int[]src={R.drawable.pic1,R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,
		R.drawable.pic5,R.drawable.pic6,R.drawable.pic7,R.drawable.pic8,R.drawable.pic9
};
private ImageSwitcher imageSwitch;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		gallery=(Gallery) findViewById(R.id.gallery);
		imageSwitch=(ImageSwitcher) findViewById(R.id.imageSwitcher);
		ImageAdapter adapter=new ImageAdapter(src, this);//为适配器使用命名
		gallery.setAdapter(adapter);//加载适配器
		gallery.setOnItemSelectedListener(this);
		imageSwitch.setFactory(this);
		//添加安卓自带的动画效果,淡入淡出
		imageSwitch.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
		imageSwitch.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));
		
	}
	@Override
	public View makeView() {
		ImageView image=new ImageView(this);
		image.setScaleType(ScaleType.FIT_CENTER);//显示图片为等比例显示缩放,并居中
		return image;
	}
	@Override
	public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
	imageSwitch.setBackgroundResource(src[arg2%src.length]);//加载当前Gallery中显示的图片	
		}
	@Override
	public void onNothingSelected(AdapterView<?> arg0) {		
	}
}


0 回复 有任何疑惑可以回复我~
#1

ziom

getView()不能这么写,每次滑动都新创建一个ImageView,而且还是大图,肯定会卡。做一下优化处理
2016-08-19 回复 有任何疑惑可以回复我~
#2

元素滴3579866 提问者 回复 ziom

我是看老师这么写的,怎么改啊
2016-08-19 回复 有任何疑惑可以回复我~
#3

ziom 回复 ziom

比如创建一个ImageView的数组,长度与src一致,在getView()的时候,首先根据position做求余获得当前应该显示的图片下标,然后判断ImageView数组的容量(注意这里说的容量),如果下标>=容量就new ImageView然后存入数组,否则就直接从数组中取得ImageView。
2016-08-19 回复 有任何疑惑可以回复我~
#4

元素滴3579866 提问者 回复 ziom

所以我就觉得奇怪,这么小的一个软件怎么会这么卡
2016-08-19 回复 有任何疑惑可以回复我~
#5

ziom 回复 ziom

老师的侧重点不同,他是为了讲解控件的使用,再说这种基础代码估计老师也懒得做优化处理
2016-08-19 回复 有任何疑惑可以回复我~
#6

元素滴3579866 提问者 回复 ziom

具体怎么操作啊,我试了下,private ImageView[]image=new ImageView[9];是这样建立数组吗,然后不知怎么操作了
2016-08-19 回复 有任何疑惑可以回复我~
#7

ziom 回复 元素滴3579866 提问者

这样写就太low了,你创建适配器的时候不是要传入src吗,在适配器的构造里获取到src的length并创建ImageView数组
2016-08-19 回复 有任何疑惑可以回复我~
#8

ziom 回复 ziom

对了,我前面的容量和长度说反了
2016-08-19 回复 有任何疑惑可以回复我~
#9

ziom 回复 ziom

应该是容量与Src一致,判断长度
2016-08-19 回复 有任何疑惑可以回复我~
#10

元素滴3579866 提问者 回复 ziom

能帮我看下改哪里吗,我代码贴在下面了
2016-08-21 回复 有任何疑惑可以回复我~
查看7条回复

代码贴出来看看啊

0 回复 有任何疑惑可以回复我~
#1

元素滴3579866 提问者

贴在下面了,麻烦看看啊
2016-08-19 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android攻城狮的第二门课(第1季)
  • 参与学习       111161    人
  • 解答问题       1457    个

本课程由浅入深地带您学会Android的常用控件的开发和使用

进入课程

发现用这个控件滑动图片好卡啊

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信