如何使用列表视图有效地单击项目

时间:2014-06-24 21:40:57

标签: android listview onitemclicklistener

我有一个列表视图,在每个列表项中,我有图像视图和三个文本视图,这些图像视图中的三个就像一个图像按钮,即响应点击事件,因此是文本视图中的两个。我尝试使用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实现,我仍然没有得到我想要点击的确切项目

3 个答案:

答案 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静态类只能帮助保存视图并更快地访问它们,但它并没有帮助处理列表视图项中特定项目视图的事件监听器,老实说,我还没有看到任何合理的解决方案。互联网或谷歌开发者网站。

好的,经过两个晚上的绞尽脑汁和无休止的测试,我终于找到了解决方案。

使用setTagViewHolder实现但只是区别对待,将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%的事情你需要做的就是你想要做的事情。