[英]How to handle a click event of a child view of a listview item view?
[英]How to handle click event for a list view item with checkbox in Android listview?
我正在使用ArrayAdapter
和android.R.layout.simple_list_item_multiple_choice
作为我的列表视图。 我有一个列表视图的onItemClick()
处理程序,它启动一个活动,详细显示所选项目。
我希望只有在复选框外发生点击时才启动此活动。 当单击该复选框时,我希望切换复选框状态,而不是启动详细信息视图活动。 目前,两者都在点击列表中的任何位置时发生,这是不希望的。
可能吗? 或者我应该使用自定义适配器并添加复选框和onclick处理程序?
您可以为此使用custom Adapter
类,并使用自定义适配器的代码
如需参考,请点击此处
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 ;
}
}
你可以这样做
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.