Android 如何为列表框中的可单击元素设置侦听器

Android 如何为列表框中的可单击元素设置侦听器,android,android-listview,Android,Android Listview,我有一个活动(不是ListActivity,尽管我应该将代码转换成一个,因为它只显示ListView)。在这个ListView中,我为行设置了一个布局,它包含两个TextView和一个复选框。布局由另一个活动共享,因此我设置了复选框。visibility=“GONE”,以便活动可以在需要复选框时自己启用它们 我的ListView有一个SimpleCorsorAdapter。在这个适配器中,我覆盖了setViewValue(),因此我可以启用复选框,如下所示: adapter = new Simp

我有一个活动(不是ListActivity,尽管我应该将代码转换成一个,因为它只显示ListView)。在这个ListView中,我为行设置了一个布局,它包含两个TextView和一个复选框。布局由另一个活动共享,因此我设置了
复选框。visibility=“GONE”
,以便活动可以在需要复选框时自己启用它们

我的ListView有一个SimpleCorsorAdapter。在这个适配器中,我覆盖了
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
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
此外,我还设置了一个
onClickListener()
,因为用户应该单击一个列表元素(整行)。侦听器如下所示:

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
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
listItems.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
final int numItems=cursor.getInt(cursor.getColumnIndex(LocationDB.C_NUM_ITEMS));
String foo=String.format(标记+“单击:%d”,numItems);
Log.i(Log_标签,foo);
AlertDialog.Builder dialog=新建AlertDialog.Builder(StoreBrowser.this);
setMessage(“Vill du bevaka?”);
setPositiveButton(“Ja”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//TODO:在此处保存到数据库
System.out.println(“来自onClick的你好”);
ldb.AddFavorite(ID);
}
});//设置正按钮
setNegativeButton(“Nej”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
Toast.makeText(getApplicationContext(),“单击否”,Toast.LENGTH\u SHORT.show();
}
});//设置负按钮
dialog.show();
}//麦克利克
}); // 塞托尼麦克利克监听器
问题:

  • 在setViewValue()中,根据Logcat发出三次代码
    ldb.isfavorite()
    (我在方法中使用Log.d()。为什么叫三次?其中有一个SQL查询正在运行,我怀疑对每个listview行运行三次会非常昂贵
  • 2a。如何拦截对复选框的单击?当用户切换复选框时,我需要切换一个布尔变量。
    onClick()
    仅在用户单击整个listview行时激发,但在单击复选框时,不会发生任何事情

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


    附加问题:我想我应该重写这段代码并手动放大listview及其元素,所以如果有人能给我指出一个描述这类工作的好资源,我将不胜感激。谷歌的API文档没有多大帮助。

    @1。您的光标遍历多少行?-我猜可能是3点


    @2b。不太清楚
    列表视图
    ,但看看如何遍历
    列表视图的子视图,并在中找到所需的子视图,在列表视图的每个子视图中。

    @1:数据库中当前只有一行,只有一个列表视图行,这就是为什么我对该方法调用三次感到困惑的原因。