一般listview的每个item都有点击事件,一个item一个点击事件是没有问题的。
当一个item中出现多个点击效果时,并且还要保留item的点击效果,我们该怎么处理呢?
这时我们需要用到这个属性(一般写在item的布局上)
这个属性的作用就是:阻止焦点向子控件传递。
android:descendantFocusability="blocksDescendants"
单个控件时使用:
android:focusable="false"
这个需要注意一下,Demo如下:
Activity布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<Button
android:id="@+id/mBt_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"
android:onClick="onClick"
android:textColor="#0000ff"
android:background="@color/colorAccent"
android:layout_weight="1"
android:layout_margin="5dp"
/>
<Button
android:id="@+id/mBt_un_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="反选"
android:onClick="onClick"
android:textColor="#0000ff"
android:background="@color/colorAccent"
android:layout_weight="1"
android:layout_margin="5dp"
/>
<Button
android:id="@+id/mBt_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:onClick="onClick"
android:textColor="#0000ff"
android:background="@color/colorAccent"
android:layout_weight="1"
android:layout_margin="5dp"
/>
<Button
android:id="@+id/mBt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"
android:onClick="onClick"
android:textColor="#0000ff"
android:background="@color/colorAccent"
android:layout_weight="1"
android:layout_margin="5dp"
/>
</LinearLayout>
<ListView
android:id="@+id/mListView"
android:overScrollMode="never"
android:divider="@color/colorAccent"
android:dividerHeight="0.1dp"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
item布局:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:descendantFocusability="blocksDescendants"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<TextView
android:id="@+id/mTe_item"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_margin="5dp"
android:layout_centerVertical="true"
/>
<CheckBox
android:id="@+id/mCb_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>
</RelativeLayout>
完整代码:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<String> list;
private List<Boolean> checks;
private ListView listView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.mListView);
// 添加数据
initData();
}
private void initData() {
list = new ArrayList<>();
checks = new ArrayList<>();
for (int i = 0; i < 30; i++) {
list.add("数据"+i);
checks.add(false);
}
adapter = new MyAdapter(this, list);
adapter.setData(list, checks);
listView.setAdapter(adapter);
// 条目点击
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "item点击了", Toast.LENGTH_SHORT).show();
checks.set(position, !checks.get(position));
adapter.setData(list, checks);
adapter.notifyDataSetChanged();
}
});
}
// 按钮点击
public void onClick(View view) {
switch (view.getId()) {
case R.id.mBt_all:
select_All();
break;
case R.id.mBt_un_all:
select_UnAll();
break;
case R.id.mBt_cancle:
select_cancle();
break;
case R.id.mBt_delete:
select_delete();
break;
}
}
// 删除
private void select_delete() {
for (int i = 0; i < checks.size(); i++) {
// 判断是否选中,清除多选按钮,数据,以及索引
if (checks.get(i)) {
checks.remove(i);
list.remove(i);
i--;
}
adapter.setData(list, checks);
adapter.notifyDataSetChanged();
}
}
// 取消
private void select_cancle() {
for (int i = 0; i < checks.size(); i++) {
checks.set(i, false);
}
adapter.setData(list, checks);
adapter.notifyDataSetChanged();
}
// 反选
private void select_UnAll() {
for (int i = 0; i < checks.size(); i++) {
checks.set(i, !checks.get(i));
}
adapter.setData(list, checks);
adapter.notifyDataSetChanged();
}
//全选
private void select_All() {
for (int i = 0; i < checks.size(); i++) {
checks.set(i, true);
}
adapter.setData(list, checks);
adapter.notifyDataSetChanged();
}
}
Adapter:
public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<String> mList;
private List<Boolean> checks;
public MyAdapter(Context mContext, List<String> mList) {
this.mContext = mContext;
this.mList = mList;
}
public void setData(List<String> mList,List<Boolean> checks) {
this.mList = mList;
this.checks = checks;
}
@Override
public int getCount() {
return mList==null?0:mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
convertView= View.inflate(mContext,R.layout.layout_listeitem,null);
ViewHolder viewHolder = ViewHolder.getViewHolder(convertView);
viewHolder.textView.setText(mList.get(position));
viewHolder.checkBox.setChecked(checks.get(position));
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checks.set(position,isChecked);
notifyDataSetChanged();
}
});
return convertView;
}
static class ViewHolder{
private TextView textView;
private CheckBox checkBox;
public ViewHolder(View convertView){
textView=convertView.findViewById(R.id.mTe_item);
checkBox=convertView.findViewById(R.id.mCb_item);
}
public static ViewHolder getViewHolder(View convertView){
ViewHolder viewHolder= (ViewHolder) convertView.getTag();
if (viewHolder==null){
viewHolder=new ViewHolder(convertView);
convertView.setTag(viewHolder);
}
return viewHolder;
}
}