Android 의 ListView 다 중 선택 삭제 동작 구현 코드
데모 연습,이름 이 복잡 하 니 신경 쓰 지 마 세 요.
메 인 인터페이스 레이아웃 activitymain.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rootView"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.listchecked.MainActivity" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
>
</ListView>
<LinearLayout
android:id="@+id/button_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/listView1"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<Button
android:id="@+id/del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" " />
</LinearLayout>
</RelativeLayout>
목록 item 의 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants" >
<!-- , , list OnItemClickListener -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title"
android:textSize="20sp" />
<TextView
android:id="@+id/teacher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Teacher" />
<TextView
android:id="@+id/time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Time" />
<TextView
android:id="@+id/peopleNum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="peopleNum"
/>
</LinearLayout>
</LinearLayout>
이 아 이 템 의 레이아웃 은 디 테 일 에 한 번 구 덩이 됩 니 다.아 이 템 에 button,checkbox,imageButton 등 을 추가 하면 이 컨트롤 에 만 응답 하 는 이벤트 가 발생 합 니 다.아 이 템 의 전체적인 사건 은 응답 하지 않 습 니 다.처음에 그 속성 을 추가 하지 않 았 습 니 다.checkbox 를 선택 한 후에 점 을 삭제 하면 반응 이 없습니다.이 문 제 는 발견 하기 도 어렵 습 니 다.예전 에 대 신 들 이 구 조 를 분석 하 는 도구 인 hierarchy viewer 를 추천 한 적 이 있 습 니 다.이 도 구 는 개인 적 으로 전단 개발 중인 F12 와 비슷 하고 편리 하 며 모든 구조의 상황 을 볼 수 있 습 니 다.또한 궁금 합 니 다.클릭 을 해 보 세 요.전체 item 의 레이아웃 은 아버지 레이아웃 부터 하위 레이아웃 까지 checkbox 가 click 을 받 아들 일 수 있 으 면 다른 것 은 모두 false 입 니 다.이것 이 문제 입 니 다.나중에 바 이 두 가 결론 을 내 렸 습 니 다.해결 방법 은 Android:descendant Focusability="Blocks Descendants"를 list 의 item 레이아웃 에 추가 하 는 것 입 니 다.추가 한 후에 checkbox 는 단독 클릭 이 가능 하고 list 의 클릭 에 응 하지 않 고 선택 한 이벤트 에 응답 하지 않 는 것 을 발견 하면 이상 합 니 다.다른 사람의 예 를 보면 이런 현상 이 없습니다.마지막 으로 checkbox 만 설정 할 수 있 습 니 다.android:clickable="false"레이아웃 문제 가 해결 되 었 습 니 다.다음은 자바 류 의 소스 코드 입 니 다.
우선 bean 류,ItemBean.자바.
package com.example.listchecked;
public class ItemBean {
private int imgRes;
private String title,teacher,time;
private int peopleNum,id;
private boolean isChecked;
private boolean isShow;
public boolean isShow() {
return isShow;
}
public void setShow(boolean isShow) {
this.isShow = isShow;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean isChecked) {
this.isChecked = isChecked;
}
public int getImgRes() {
return imgRes;
}
public void setImgRes(int img) {
this.imgRes = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public int getPeopleNum() {
return peopleNum;
}
public void setPeopleNum(int peopleNum) {
this.peopleNum = peopleNum;
}
}
사용자 정의 Adapter,MyListAdapter.java
package com.example.listchecked;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
public class MyListAdapter extends BaseAdapter
{
private LayoutInflater inflater;
private List<ItemBean> items;
private ItemBean item;
private OnShowItemClickListener onShowItemClickListener;
public MyListAdapter(List<ItemBean> list,Context context)
{
items=list;
inflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO
return items.size();
}
@Override
public Object getItem(int position) {
// TODO
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO
return items.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO
ViewHolder holder;// ViewHolder,
if(convertView==null)
{
holder=new ViewHolder();
convertView=inflater.inflate(R.layout.item_view, null);
holder.img=(ImageView) convertView.findViewById(R.id.imageView1);
holder.cb=(CheckBox) convertView.findViewById(R.id.checkBox1);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.teacher=(TextView) convertView.findViewById(R.id.teacher);
holder.time=(TextView) convertView.findViewById(R.id.time);
holder.poeple=(TextView)convertView.findViewById(R.id.peopleNum);
convertView.setTag(holder);
}else
{
holder=(ViewHolder) convertView.getTag();
}
item=items.get(position);
if(item.isShow())
{
holder.cb.setVisibility(View.VISIBLE);
}
else
{
holder.cb.setVisibility(View.GONE);
}
holder.img.setImageResource(item.getImgRes());
holder.title.setText(item.getTitle());
holder.teacher.setText(" :"+item.getTeacher());
holder.time.setText(" :"+item.getTime()+" ");
holder.poeple.setText(" :"+item.getPeopleNum());
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
item.setChecked(true);
}
else
{
item.setChecked(false);
}
// , item
onShowItemClickListener.onShowItemClick(item);
}
});
//
holder.cb.setChecked(item.isChecked());
return convertView;
}
static class ViewHolder
{
ImageView img;
CheckBox cb;
TextView title,teacher,time,poeple;
}
public interface OnShowItemClickListener {
public void onShowItemClick(ItemBean bean);
}
public void setOnShowItemClickListener(OnShowItemClickListener onShowItemClickListener) {
this.onShowItemClickListener = onShowItemClickListener;
}
}
마지막 으로 MainActivity.java.
package com.example.listchecked;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.example.listchecked.MyListAdapter.OnShowItemClickListener;
public class MainActivity extends Activity implements OnShowItemClickListener {
private ListView listView;
private List<ItemBean> dataList,selectedList;
private MyListAdapter myAdapter;
private RelativeLayout rootView;
private LinearLayout menuView;
private LinearLayout openView;
private static boolean isShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isShow=false;
setContentView(R.layout.activity_main);
Button delbtn=(Button) findViewById(R.id.del);
rootView=(RelativeLayout) findViewById(R.id.rootView);
menuView=(LinearLayout) findViewById(R.id.button_group);
listView=(ListView) findViewById(R.id.listView1);
dataList=new ArrayList<ItemBean>();
selectedList=new ArrayList<ItemBean>();
for(int i=0;i<10;i++)
{
ItemBean item=new ItemBean();
item.setId(i);
item.setImgRes(R.drawable.ic_launcher);
item.setTitle(" "+item.getId()+" ");
item.setTeacher(" ");
item.setTime("34");
item.setPeopleNum(i+1*100);
item.setChecked(false);
item.setShow(isShow);
dataList.add(item);
}
myAdapter=new MyListAdapter(dataList, this);
myAdapter.setOnShowItemClickListener(MainActivity.this);
listView.setAdapter(myAdapter);
delbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO
showMenu();
isShow=true;
selectedList.clear();
for(ItemBean item:dataList)
{
item.setShow(isShow);
}
myAdapter.notifyDataSetChanged();
}
});
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO
if (isShow) {
ItemBean item = dataList.get(position);
boolean isChecked = item.isChecked();
if (isChecked) {
item.setChecked(false);
} else {
item.setChecked(true);
}
myAdapter.notifyDataSetChanged();
Log.d("select",selectedList.size()+"");
}
}
});
}
//
private void showMenu()
{
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
openView=(LinearLayout) inflater.inflate(R.layout.delmenu_layout, null);
rootView.removeView(menuView);
rootView.addView(openView,lp);
final Button sBtn=(Button) openView.findViewById(R.id.selectAll);
Button dBtn=(Button) openView.findViewById(R.id.del_button);
Button cBtn= (Button) openView.findViewById(R.id.cancel_button);
sBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO
if (" ".equals(sBtn.getText().toString())) {
for (ItemBean bean : dataList) {
if (!bean.isChecked()) {
bean.setChecked(true);
if (!selectedList.contains(bean)) {
selectedList.add(bean);
}
}
}
myAdapter.notifyDataSetChanged();
sBtn.setText(" ");
} else if (" ".equals(sBtn.getText().toString())) {
for (ItemBean bean : dataList) {
bean.setChecked(false);
if (!selectedList.contains(bean)) {
selectedList.remove(bean);
}
}
myAdapter.notifyDataSetChanged();
sBtn.setText(" ");
}
}
});
dBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO
if (selectedList!=null && selectedList.size()>0) {
dataList.removeAll(selectedList);
myAdapter.notifyDataSetChanged();
selectedList.clear();
} else {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
}
}
});
cBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO
if (isShow) {
selectedList.clear();
for (ItemBean bean : dataList) {
bean.setChecked(false);
bean.setShow(false);
}
myAdapter.notifyDataSetChanged();
isShow = false;
restoreView();
}
}
});
}
@Override
public void onShowItemClick(ItemBean bean) {
// TODO
if (bean.isChecked() && !selectedList.contains(bean)) {
selectedList.add(bean);
} else if (!bean.isChecked() && selectedList.contains(bean)) {
selectedList.remove(bean);
}
}
private void restoreView()
{
rootView.addView(menuView);
if(openView!=null)
{
rootView.removeView(openView);
openView=null;
}
}
}
마지막 으로 그 작은 메뉴 의 레이아웃 이 있 으 니 올 려 놓 으 세 요.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/selectAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" " />
<Button
android:id="@+id/del_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" " />
<Button
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" " />
</LinearLayout>
모든 코드 를 올 렸 습 니 다.붙 여 넣 기 를 복사 하지 않 으 려 면 GitHub 주소:https://github.com/2767321434/ListChecked이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.