简体   繁体   English

如何使用Android listview中的复选框处理列表视图项的单击事件?

[英]How to handle click event for a list view item with checkbox in Android listview?

I am using ArrayAdapter with android.R.layout.simple_list_item_multiple_choice for my list view. 我正在使用ArrayAdapterandroid.R.layout.simple_list_item_multiple_choice作为我的列表视图。 I have an onItemClick() handler for the list view that launches an activity which displays the selected item in detail. 我有一个列表视图的onItemClick()处理程序,它启动一个活动,详细显示所选项目。

I would like this activity launched only when the click happens outside the checkbox. 我希望只有在复选框外发生点击时才启动此活动。 And when the checkbox is clicked on, I want the checkbox status toggled and NOT launch the detail view activity. 当单击该复选框时,我希望切换复选框状态,而不是启动详细信息视图活动。 Currently, both happen always when clicked on anywhere in the list, which is not desired. 目前,两者都在点击列表中的任何位置时发生,这是不希望的。

Is it possible? 可能吗? Or should I use a custom adapter and add a checkbox and onclick handler? 或者我应该使用自定义适配器并添加复选框和onclick处理程序?

You can use custom Adapter class for this, and code that use custom adapter is 您可以为此使用custom Adapter类,并使用自定义适配器的代码

For ref check here 如需参考,请点击此处

  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 ;  
  }  
}  

you can do like this 你可以这样做

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);
}
}

and selectedList 和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);
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM