【问题标题】:Adding onClick handler to View in list item将 onClick 处理程序添加到列表项中的查看
【发布时间】:2010-08-12 19:39:00
【问题描述】:

我有一个 ListActivity,其中列表项是在另一个 XML 布局中定义的。列表项布局包含一个 ImageView、一个 CheckBox、一个 TextView 等。

我想要的是为每个列表项中的 CheckBox 设置一个 onClick 侦听器。这很容易。问题是我需要那个 onClick 处理程序来知道它在列表中的哪个位置。

在 convertView 膨胀后,我将侦听器附加到 getView 中的 CheckBox。 getView 方法有一个位置参数,但我无法在我的 CheckBox 的 onClick 处理程序中引用它。我明白为什么,但我不知道如何解决。

我该如何做到这一点?

【问题讨论】:

    标签: android onclick adapter android-arrayadapter


    【解决方案1】:

    我创建了这个方法来获取位置:

        private int getListPosition(View v) {
            View vParent = (View)v.getParent();
            if (vParent != null) {
                ViewGroup vg = (ViewGroup)vParent.getParent();
                if (vg != null) {
                    return getListView().getFirstVisiblePosition() + vg.indexOfChild(vParent);
                }
            }
            return -1;
        }
    

    您可以将 buttonView 作为 v 参数传入

    【讨论】:

      【解决方案2】:

      您可以尝试在复选框上按位置设置标签,当 onCheckedChangeListener 被触发时,获取复选框的标签以获取其位置..

      这是一个示例代码,但我没有尝试过

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
      
      // grab view
      View v = convertView;
      // set view layout
      if (v == null) {
          LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          v = vi.inflate(R.layout.layout_inbox_item, null);
      
          CheckBox box = (CheckBox)v.findViewById(R.id.inbox_itemcheck);
          if (box != null) {
              box.setTag(position); //<-- sets the tag by its position
              box.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
                      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                          int position = (Integer)buttonView.getTag(); //<-- get the position
                      }
                  });
          }
      }
      

      【讨论】:

      • 有人发布了此解决方案,然后在我提出问题后删除了该解决方案。我的问题是我的列表可以由用户更改(例如:删除一行)。这会弄乱已删除行下方的行的所有索引。
      • 我想不出比您提供的更简单的解决方案了。如果我是你,我会选择那个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多