我有一个列表视图,在每个列表项中,我有图像视图和三个文本视图,这些图像视图中的三个就像一个图像按钮,即响应点击事件,因此是文本视图中的两个。我尝试使用ItemOnClickListeneri就像这样
@Override
public void onItemClick(AdapterView<?> arg0, View convertView, int pos,
long arg3) {
// TODO Auto-generated method stub
bomb = (ImageView) convertView.findViewById(R.id.bomb);
Log.i("Item Clicked", "Item was clicked at pos" + position);
bomb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Perform action on click
//Run what ever task neccessary
}
});
}
但这有一个问题,它只响应第二次点击。我知道这与父母和孩子的关注有关,但我无法解决这个问题。
我也尝试过使用
静态类
View Holder
,但我的实现错误,即使点击两次也没有响应。
我也使用自定义适配器,我曾经直接从getView
覆盖方法做到这一点,但我发现困难的方法并不是实现我想做的最佳方式。
我需要一些对我有用的东西,因为我尝试了除上述之外的其他一些东西,但它们都失败了。
获取查看代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
pos = position;
if(convertView == null)
{
convertView = inflater.inflate(R.layout.singlepost, parent, false);
holder = new ViewHolder();
holder.bomb = (ImageView) convertView.findViewById(R.id.bomb);
holder.bomb.setOnClickListener(bomb_listener);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
holder.bomb.setOnClickListener(bomb_listener);
}
return convertView;
}
private OnClickListener bomb_listener = new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("HOMEADAPTER", "BOOMB WAS CLICKED AT POSITON" + pos);
holder.bomb.setImageResource(R.drawable.redheart);
}
};
static class ViewHolder {
TextView reporter;
TextView shell;
TextView sheller;
TextView likesnum;
TextView favsnum;
TextView comnum;
ImageView bomb;
ImageView star;
ImageView comment;
}
使用这个新的getview实现,我仍然没有得到我想要点击的确切项目
答案 0 :(得分:0)
在getView()中添加clicklistener代码块,即创建视图的位置
getView(...) {
if (view == null) {
viewHolder = new ViewHolder();
view = ...inflateView code...
View bomb = view.findViewById(R.id.bomb);
bomb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Perform action on click
//Run what ever task neccessary
}
});
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)view.getTag();
}
}
答案 1 :(得分:0)
视图以自下而上的方式响应事件。含义事件以子视图开始,并传递给父视图。如果视图不能或不响应事件,则会向上传递链接。首次单击图像时,图像视图没有与之关联的OnClickListener
,因此无法响应该事件。在第一次点击时,您正在设置一个监听器。因此,下次单击该图像时,它现在有一个侦听器,可以响应该事件。这就是它在第一次点击时没有按预期响应的原因。正如66CLSjY建议的那样,您可能希望覆盖列表适配器中的getView (int position, View convertView, ViewGroup parent)
以在将图像添加到列表时设置侦听器,而不是在单击它时。
在回答您对66的答案的评论时,请记住ListViews尽可能多地重用视图。因此,即使convertView不为null,您仍然需要为其设置新的OnClickListener或以某种方式重用帐户,否则它基本上就像您单击了不同的图像。
答案 2 :(得分:0)
在抱怨这个问题并试图解决它之后。我个人认为列表视图的机器人API很糟糕,应该进行改进,以便易于使用和实现。我认为在覆盖get view
方法中调用侦听器是一个坏主意,因为由于性能原因,您无法始终信任android系统返回您请求的确切视图。我引用了列表视图的开发人员。使用View Holder静态类只能帮助保存视图并更快地访问它们,但它并没有帮助处理列表视图项中特定项目视图的事件监听器,老实说,我还没有看到任何合理的解决方案。互联网或谷歌开发者网站。
好的,经过两个晚上的绞尽脑汁和无休止的测试,我终于找到了解决方案。
使用setTag
和ViewHolder
实现但只是区别对待,将ViewHolder静态实现转换为View我的意思是这个
static class ViewHolder extends View implements OnClickListener {
public ViewHolder(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
ImageView bomb;
public void assignList(){
if(bomb != null)
bomb.setOnClickListener(this);
}
public int position = -1;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("HOMEADAPTER", "OUR OWN STUFF");
}
}
在您实施OnItemClickListener
的活动中完成此操作后
你需要做的就是得到你设置的标签
ViewHolder holder = (ViewHolder) view.getTag();
所有宝贝都是如此! 90%完成了最后10%的事情你需要做的就是你想要做的事情。