android 重写用来显示Listview的BaseAdapter后,通过ImageButton监听实现卡片翻转 ,不成功。。高分悬赏

android重写用来显示Listview的BaseAdapter后,加载自定义的Layout布局,然后通过ImageButton监听实现加载布局后的卡片翻转效果,但是每... android 重写用来显示Listview的BaseAdapter后,加载自定义的Layout布局,然后通过ImageButton监听实现加载布局后的卡片翻转效果,但是每按一次ImageButton,反而是ListView的下一个Item进行翻转,又或者不转(但是我自己设定一个Toast,看是否按钮被点击,该Toast能够正常显示,且显示点击了哪个item中的ImageButton)。弄了很久都毫无头绪,再次请大神搭救( ⊙ o ⊙ )啊!。因为急用,所以在线等答案。。。

给出一部分代码,监听代码如下:

// 通过上面layout得到的view来获取里面的具体控件
holder.back = (ImageButton) convertView.findViewById(R.id.back);
holder.forward = (ImageButton) convertView.findViewById(R.id.forward);
//按钮事件是如何去知道单击的是ListView的哪一项呢,这时就要为每个Button对象添加一个Tag
holder.back.setTag(position);
holder.forward.setTag(position);

animate(holder.mContainer).setDuration(1000);

holder.back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//applyRotation(0,90,R.id.backLayout);
animate(holder.mContainer).rotationYBy(180);
Toast.makeText(mContext, "单击back"+v.getTag(), Toast.LENGTH_SHORT).show();
}
});

// 为forward添加click监听
holder.forward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//applyRotation(-1,180,R.id.frontLayout);
animate(holder.mContainer).rotationYBy(180);
Toast.makeText(mContext, "单击forward"+v.getTag(), Toast.LENGTH_SHORT).show();
}
});
现在我的position位置已经处理好了,可是下面的ImageButton监听一个旋转动画的类,就出错了。
...public void onClick(View v) {applyRotation(-1,180,R.id.frontLayout,holder.mContainer,holder.frontLayout,holder.backLayout); //通过调用这个方法,把所要翻转的控件ID加载进来,可是每当按按钮的时候,反而是当列表拉下来的时候,显示下一条数据就会进行翻转动作。就是说,我按position1,反而是psition3进行翻转动作。...
展开
 我来答
zbl1622
2013-12-23 · TA获得超过1236个赞
知道小有建树答主
回答量:569
采纳率:0%
帮助的人:591万
展开全部

很显然,你的getView方法写错了。

setTag的方法需要写在获取holder的区域外面,比如这样:

Holder holder=null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.adapter_group_main,null);
holder = new Holder();
holder.imageView = (ImageViewCustom) convertView.findViewById(R.id.imageView);
holder.iv_point = (ImageView) convertView.findViewById(R.id.iv_point);
holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
holder.tv_type = (TextView) convertView.findViewById(R.id.textView2);
holder.tv_peopleNum=(TextView) convertView.findViewById(R.id.textView3);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}

holder.tv_type.setTag(position);
holder.tv_type.setOnClickListener(省略..);
return convertView;

这样在adapter每次调用getView的时候,都会将正确的position值赋值给控件,否则控件中的position值总是第一次创建的时候的position值。要记住,listView中每一个item是会回收重用的,所以有些东西必须每次getView的时候都设置一下才会正确。


看了你追加的问题,我觉得你还是没搞清楚ListView的回收重用机制。

ListView中的每一个item不会在滑出可见区域以后被销毁,而是根据情况重新传给新出现的可见位置,通过getView方法中的convertView这个参数实现传递。同时你给这个item设置的所有listener什么也被重用了。同理,也不能通过资源id在OnClickListener中获取到正确的view 。

yu9fei
2013-12-23 · 超过34用户采纳过TA的回答
知道答主
回答量:115
采纳率:0%
帮助的人:88.5万
展开全部
觉得没必要设置tag,因为点击事件是在每个item的view生成时就添加的,从上面看好像没有问题,请附上getView方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
得蒙特
2013-12-22
知道答主
回答量:31
采纳率:0%
帮助的人:10.7万
展开全部
animate(holder.mContainer).rotationYBy(180);
你toast都是正确的,觉得这有问题.
追问
我知道我错在哪里了。是在BaseAdapter类时,里面的position有问题。我加载内容到listview后,显示的按钮返回的position竟然是没有规律的。就是一共10条数据,不是从0,1,2,3.....
而是错乱的。请问这个问题,是我的BaseAdapter类写错了嘛?
追答
BaseAdapter的代码贴了看看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式