【问题标题】:Set OnClickListener for items in ListView with 2 Views为具有 2 个视图的 ListView 中的项目设置 OnClickListener
【发布时间】:2011-06-01 11:47:47
【问题描述】:

我有一个 ListView,其中包含具有这种布局的项目:

<LinearLayout ...>            
    <LinearLayout ...>
       <!--Elements -->
    </LinearLayout>

    <LinearLayout ...>
       <!--Elements -->
    </LinearLayout>            
</LinearLayout>

所以我的项目有两个不同的部分。我希望能够在每个项目内设置不同的 onclickListener(每个 LinearLayout 一个)。到目前为止,我已经尝试覆盖 onListItemClick,但它似乎无法正常工作:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id);

    ViewGroup vg = (ViewGroup)v;
    vg.getChildAt(0).setOnClickListener(new OnClickListener() {         
        @Override
        public void onClick(View v) {
            Toast.makeText(mCtx, "element1", Toast.LENGTH_SHORT).show();                
        }
    });
    vg.getChildAt(1).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(mCtx, "element2", Toast.LENGTH_SHORT).show();                
        }
    });

}

有什么办法解决这个问题吗?

谢谢。

【问题讨论】:

  • 你确定vg.getChildAt(0)vg.getChildAt(1)返回Linearlayout
  • 没关系,我现在想要的是为listview Item设置不同的事件。

标签: android listview onclick


【解决方案1】:

您必须对 ListView 中的所有元素使用 set onclicklistener。 我创建了一个列表视图。为列表视图设置一个适配器。我的适配器负责显示列表视图的每个元素。所以在getView() 内部,我会将 onclicklistener 分配给我想要获得点击事件的所有元素。

示例

public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        ViewHolder holder;
        if(convertView==null){
            vi = inflater.inflate(R.layout.item, null);
            holder=new ViewHolder();
            holder.text=(TextView)vi.findViewById(R.id.text);;
            holder.image=(ImageView)vi.findViewById(R.id.image);
            vi.setTag(holder);
        }
        else
            holder=(ViewHolder)vi.getTag();

        holder.text.setText("item "+position);
        holder.image.setTag(data.get(position));
        holder.image.setOnClickListener(this);
        holder.text.setOnClickListener(this);
        imageLoader.DisplayImage(data.get(position), activity, holder.image);
        return vi;
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        System.out.println("...clicked view is...."+arg0);
    }

谢谢 迪帕克

【讨论】:

    【解决方案2】:

    您不需要每个列表项的 OnClickListener,但您确实需要找到每个列表视图,例如在您的活动 OnCreate 中

    listView1 = (ListView) this.findViewById(R.id.ListView1);
    listView2 = (ListView) this.findViewById(R.id.ListView2);
    

    然后你的 onListItemClick 变成 -

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id);
    
    if (l.equals(listView1))
    {
        switch (position)
        {
           case 0:
             Toast.makeText(mCtx, "list1-element1", Toast.LENGTH_SHORT).show();
             break;
           case 1:
             Toast.makeText(mCtx, "list1-element2", Toast.LENGTH_SHORT).show();
             break;
        }
    }
    else
    {
        switch (position)
        {
           case 0:
             Toast.makeText(mCtx, "list2-element1", Toast.LENGTH_SHORT).show();
             break;
           case 1:
             Toast.makeText(mCtx, "list2-element2", Toast.LENGTH_SHORT).show();
             break;
        }
    }
    
    
    }
    

    除非我误解了你的意图。

    【讨论】:

      【解决方案3】:

      我可能在这里遗漏了一些东西,但这不是设置的简洁版本:

      aListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
      

      然后执行:

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          Log.d(LOG_TAG, "List view click: " + getListView().getCheckedItemCount());
          Toast.makeText(this,
                  String.valueOf(getListView().getCheckedItemCount()),
                  Toast.LENGTH_LONG).show();
          return true;
      } 
      

      上述解决方案从 API 级别 1 开始就可用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多