【问题标题】:How to setup a listener for clickable element in a ListBox如何为 ListBox 中的可点击元素设置监听器
【发布时间】:2011-10-29 12:42:48
【问题描述】:

我有一个 Activity(不是 ListActivity,虽然我可能应该将我的代码转换为一个,因为它只显示一个 ListView)。在这个 ListView 中,我为行设置了一个布局,它包含两个 TextView 和一个 CheckBox。 Layout 由另一个 Activity 共享,所以我设置了CheckBox.visibility="GONE",以便 Activity 可以在需要复选框时自行启用它们。

我的 ListView 有一个 SimpleCursorAdapter。在这个适配器中,我覆盖了setViewValue(),所以我可以启用复选框,如下所示:

adapter = new SimpleCursorAdapter(this, R.layout.location_browser_listview_relative, cursor, FROM, TO);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
  @Override
  public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
    if (view.getId() == R.id.checkBox) {
      // Enable the star-checkbox
      ldb.isFavourite(cursor.getInt(cursor.getColumnIndex(LocationDB.C_ID)));
      view.setVisibility(View.VISIBLE);
      ((TextView)view).setText("");
      return true;
    }

    return false;
  } // setViewValue
}); // setViewBinder

此外,我设置了onClickListener(),因为用户应该单击列表元素(整行)。监听器是这样的:

listItems.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    final int numItems = cursor.getInt(cursor.getColumnIndex(LocationDB.C_NUM_ITEMS));
    String foo = String.format(TAG + "Clicked: %d", numItems);
    Log.i(LOG_TAG, foo);

    AlertDialog.Builder dialog = new AlertDialog.Builder(StoreBrowser.this);
    dialog.setMessage("Vill du bevaka?");
    dialog.setPositiveButton("Ja", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        // TODO: Save to DB here
        System.out.println("Hello from onClick");

        ldb.addFavourite(ID);
      }
    }); // setPositiveButton         

    dialog.setNegativeButton("Nej", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(getApplicationContext(), "Clicked no", Toast.LENGTH_SHORT).show();
      }
    }); // setNegativeButton         

    dialog.show();
  } // onItemClick
}); // setOnItemClickListener

问题:

  1. 在setViewValue()中,代码ldb.isFavourite()根据Logcat发出三次(我在方法中使用Log.d())。为什么叫三遍?其中运行了一个 SQL 查询,我怀疑为每个 listview 行运行 3 次会非常昂贵。

2a。如何拦截单击复选框?当用户切换复选框时,我需要切换一个布尔变量。 onClick() 仅在用户单击整个列表视图行时触发,但当单击复选框时没有任何反应。

2b。有没有办法同时收集所有复选框信息,而不是在用户点击时切换布尔值?我的意思是,当用户完成选择后,有没有办法在循环中一个一个地遍历所有列表元素并获取点击值?

奖励问题:我怀疑我应该重写此代码并手动填充列表视图及其元素,因此,如果有人能指出我描述此类工作的良好资源,我将不胜感激。 Google 的 API 文档不是很有帮助。

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    @ 1. 你的光标遍历了多少行? - 我怀疑它可能是 3。

    @2b。不太确定 ListView,但请查看 ViewGroup.getChildAt() 以遍历 ListView 的子视图和 View.findViewById() 以在 ListView 的每个子视图中找到所需的子视图。

    【讨论】:

    • @1:数据库中目前只有一行,ListView-row只有一个,这就是为什么我对为什么该方法被调用三次感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多