如何在Android的ListView中处理带有复选框的列表项的点击事件?

3
我正在使用ArrayAdapterandroid.R.layout.simple_list_item_multiple_choice来为我的列表视图提供支持。我有一个onItemClick()处理程序,用于启动显示所选项目详细信息的活动。
我希望只有在单击复选框外部时才启动此活动。当单击复选框时,我希望切换复选框状态并且不启动详细视图活动。目前,无论单击列表中的任何位置都会发生这两种情况,这是不希望看到的。
这是否可行?或者我应该使用自定义适配器并添加复选框和单击处理程序?

你必须使用自定义适配器来完成此操作。 - pixelscreen
使用自定义适配器(custom adapter)以及 setTag() 和 getTag() 来处理复选框(checkboxes)。 - Anurag Shrivastava
2个回答

1

您可以使用自定义适配器类来实现此功能,使用自定义适配器的代码如下:

请参考此处

  public class PlanetsActivity extends Activity {  

  private ListView mainListView ;  
  private Planet[] planets ;  
  private ArrayAdapter<Planet> listAdapter ;  

  /** Called when the activity is first created. */  
  @Override  
  public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  

    // Find the ListView resource.   
    mainListView = (ListView) findViewById( R.id.mainListView );  

    // When item is tapped, toggle checked properties of CheckBox and Planet.  
    mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
      @Override  
      public void onItemClick( AdapterView<?> parent, View item,   
                               int position, long id) {  
        Planet planet = listAdapter.getItem( position );  
        planet.toggleChecked();  
        PlanetViewHolder viewHolder = (PlanetViewHolder) item.getTag();  
        viewHolder.getCheckBox().setChecked( planet.isChecked() );  
      }  
    });  


    // Create and populate planets.  
    planets = (Planet[]) getLastNonConfigurationInstance() ;  
    if ( planets == null ) {  
      planets = new Planet[] {   
          new Planet("Mercury"), new Planet("Venus"), new Planet("Earth"),   
          new Planet("Mars"), new Planet("Jupiter"), new Planet("Saturn"),   
          new Planet("Uranus"), new Planet("Neptune"), new Planet("Ceres"),  
          new Planet("Pluto"), new Planet("Haumea"), new Planet("Makemake"),  
          new Planet("Eris")  
      };    
    }  
    ArrayList<Planet> planetList = new ArrayList<Planet>();  
    planetList.addAll( Arrays.asList(planets) );  

    // Set our custom array adapter as the ListView's adapter.  
    listAdapter = new PlanetArrayAdapter(this, planetList);  
    mainListView.setAdapter( listAdapter );        
  }  

  /** Holds planet data. */  
  private static class Planet {  
    private String name = "" ;  
    private boolean checked = false ;  
    public Planet() {}  
    public Planet( String name ) {  
      this.name = name ;  
    }  
    public Planet( String name, boolean checked ) {  
      this.name = name ;  
      this.checked = checked ;  
    }  
    public String getName() {  
      return name;  
    }  
    public void setName(String name) {  
      this.name = name;  
    }  
    public boolean isChecked() {  
      return checked;  
    }  
    public void setChecked(boolean checked) {  
      this.checked = checked;  
    }  
    public String toString() {  
      return name ;   
    }  
    public void toggleChecked() {  
      checked = !checked ;  
    }  
  }  

  /** Holds child views for one row. */  
  private static class PlanetViewHolder {  
    private CheckBox checkBox ;  
    private TextView textView ;  
    public PlanetViewHolder() {}  
    public PlanetViewHolder( TextView textView, CheckBox checkBox ) {  
      this.checkBox = checkBox ;  
      this.textView = textView ;  
    }  
    public CheckBox getCheckBox() {  
      return checkBox;  
    }  
    public void setCheckBox(CheckBox checkBox) {  
      this.checkBox = checkBox;  
    }  
    public TextView getTextView() {  
      return textView;  
    }  
    public void setTextView(TextView textView) {  
      this.textView = textView;  
    }      
  }  

  /** Custom adapter for displaying an array of Planet objects. */  
  private static class PlanetArrayAdapter extends ArrayAdapter<Planet> {  

    private LayoutInflater inflater;  

    public PlanetArrayAdapter( Context context, List<Planet> planetList ) {  
      super( context, R.layout.simplerow, R.id.rowTextView, planetList );  
      // Cache the LayoutInflate to avoid asking for a new one each time.  
      inflater = LayoutInflater.from(context) ;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
      // Planet to display  
      Planet planet = (Planet) this.getItem( position );   

      // The child views in each row.  
      CheckBox checkBox ;   
      TextView textView ;   

      // Create a new row view  
      if ( convertView == null ) {  
        convertView = inflater.inflate(R.layout.simplerow, null);  

        // Find the child views.  
        textView = (TextView) convertView.findViewById( R.id.rowTextView );  
        checkBox = (CheckBox) convertView.findViewById( R.id.CheckBox01 );  

        // Optimization: Tag the row with it's child views, so we don't have to   
        // call findViewById() later when we reuse the row.  
        convertView.setTag( new PlanetViewHolder(textView,checkBox) );  

        // If CheckBox is toggled, update the planet it is tagged with.  
        checkBox.setOnClickListener( new View.OnClickListener() {  
          public void onClick(View v) {  
            CheckBox cb = (CheckBox) v ;  
            Planet planet = (Planet) cb.getTag();  
            planet.setChecked( cb.isChecked() );  
          }  
        });          
      }  
      // Reuse existing row view  
      else {  
        // Because we use a ViewHolder, we avoid having to call findViewById().  
        PlanetViewHolder viewHolder = (PlanetViewHolder) convertView.getTag();  
        checkBox = viewHolder.getCheckBox() ;  
        textView = viewHolder.getTextView() ;  
      }  

      // Tag the CheckBox with the Planet it is displaying, so that we can  
      // access the planet in onClick() when the CheckBox is toggled.  
      checkBox.setTag( planet );   

      // Display planet data  
      checkBox.setChecked( planet.isChecked() );  
      textView.setText( planet.getName() );        

      return convertView;  
    }  

  }  

  public Object onRetainNonConfigurationInstance() {  
    return planets ;  
  }  
}  

0

你可以这样做

public class MainActivity extends ActionBarActivity implements OnClickListener {

Button mbtn_submit;

ListView mlistview;

List<String> namesList;

ArrayAdapter<String> adapter;

String names[] = { "Divya", "Kavya", "Janu", "Anu", "Sneha", "Vistnu",
        "Ravi", "Anil" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mlistview = (ListView) findViewById(R.id.listview);
    mbtn_submit = (Button) findViewById(R.id.btn_submit);

    namesList = new ArrayList<String>();
    for (int i = 0; i < names.length; i++) {

        namesList.add(names[i]);
    }
    adapter = new ArrayAdapter<>(this,
            android.R.layout.simple_list_item_multiple_choice, namesList);
    mlistview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    mlistview.setAdapter(adapter);

    mbtn_submit.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    SparseBooleanArray checked = mlistview.getCheckedItemPositions();

    ArrayList<String> selectedItems = new ArrayList<String>();

    for (int i = 0; i < checked.size(); i++) {
        int position = checked.keyAt(i);
        if (checked.valueAt(i))
            selectedItems.add(adapter.getItem(position));
    }
    String[] selectedItemsArr = new String[selectedItems.size()];

    for (int i = 0; i < selectedItems.size(); i++) {
        selectedItemsArr[i] = selectedItems.get(i);
    }

    Intent intent = new Intent(MainActivity.this,
            SelectedListActivity.class);

    Bundle bundle = new Bundle();
    bundle.putStringArray("selectedItems", selectedItemsArr);

    intent.putExtras(bundle);

    startActivity(intent);
}
}

和selectedList

public class SelectedListActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_selected_list);

    Bundle bundle = getIntent().getExtras();
    String[] resultArr = bundle.getStringArray("selectedItems");
    ListView lv = (ListView) findViewById(R.id.selectedList);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, resultArr);
    lv.setAdapter(adapter);
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接