Android ListView 는 단일 선택 과 다 중 선택 을 지원 하 는 투표 항목 을 구축 합 니 다.
저 희 는 안 드 로 이 드 앱 개발 에서 사용자 가 선택 할 수 있 는 옵션 목록 을 제공 하 는 수 요 를 만 날 수 있 습 니 다.예 를 들 어 투표 유형의 프로젝트 에서 저 희 는 일부 주 제 를 사용자 에 게 선택 할 수 있 습 니 다.각 주 제 는 몇 가지 옵션 이 있 고 사용 자 는 이러한 주제 의 옵션 을 선택 한 후에 제출 합 니 다.
본 고 는 단일 선거 와 다 중 투표 항목 을 지원 하 는 것 을 예 로 들 어 하나의 ListView 에서 CheckBox 목록 과 RadioButton 목록 을 어떻게 구축 하 는 지 보 여 주 었 고 실현 의 원리 와 방향 을 분석 하여 필요 한 친구 들 에 게 참 고 를 제공 했다.
프로젝트 의 프레젠테이션 효 과 는 다음 과 같다.
데이터 원본
일반적으로 우리 의 데 이 터 는 데이터베이스 에서 나온다.우선 투표 항목 류 Subject Item 을 구축 합 니 다.
/**
*
* @author zoupeiyang
*
*/
public class SubjectItem {
/**
* id
*/
private String subjectId;
/**
*
*/
private String subjectName;
/**
* id
*/
private String itemId;
/**
*
*/
private String itemName;
/**
*
*/
private Boolean isMultiChoice;
public String getSubjectId() {
return subjectId;
}
public void setSubjectId(String subjectId) {
this.subjectId = subjectId;
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public Boolean getIsMultiChoice() {
return isMultiChoice;
}
public void setIsMultiChoice(Boolean isMultiChoice) {
this.isMultiChoice = isMultiChoice;
}
}
그 다음 에 저 희 는 Subject Item 대상 의 List 집합 을 구 축 했 습 니 다.이 투표 항목 의 데이터 소스 로 서 실제 프로젝트 에서 이 데이터 소스 는 데이터 베이스 투표 항목 표 에서 나 올 수 있 습 니 다.
/**
*
*
* @return
*/
public static List<SubjectItem> getSubjectItems() {
List<SubjectItem> list = new ArrayList<SubjectItem>();
HashMap<String, Boolean> subjectMap = new HashMap<String, Boolean>();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
SubjectItem item = new SubjectItem();
item.setSubjectId(i + "");
// , , ,
// ListView
if (subjectMap.containsKey(item.getSubjectId())) {
item.setSubjectName("");
} else {
item.setSubjectName(" " + i);
subjectMap.put(item.getSubjectId(), true);
}
item.setItemId(i + "" + j);
item.setItemName(" " + i + "" + j);
item.setIsMultiChoice(i % 2 == 1 ? true : false);
list.add(item);
}
}
return list;
}
어떻게 ListView 컨트롤 에 투표 항목 을 목록 으로 보 여 줍 니까?우선 ListView 컨트롤 에서 목록 데 이 터 를 보 여 주 는 절 차 를 알 아 보 겠 습 니 다.
1.디 스 플레이 목록 의 줄 마다 레이아웃 layot 를 정의 합 니 다.이 layot 의 파일 이름 은 listview 입 니 다.subject_item.xml。
2.listview 를 보 여 주 는 레이아웃 layot 를 정의 합 니 다.이 layot 의 파일 이름 은 listview 입 니 다.subject_activity.xml。
3.listview 의 데이터 어댑터 Subject Adapter 를 정의 합 니 다.
ListView 컨트롤 의 열 마다 레이아웃 정의
listview_subject_item.xml 파일 이 정의 하 는 ListView 컨트롤 의 열 마다 view 의 레이아웃 입 니 다.이 곳 의 투표 항목 은 단일 선택 과 여러 가 지 를 지원 합 니 다.모든 view 의 레이아웃 에는 CheckBox 와 RadioButton 컨트롤 이 포함 되 어 있 습 니 다.모 바 일 인터페이스 에서 보 기 를 표시 할 때 현재 항목 의 투표 유형(단일 선택 또는 다 중 선택)에 따라 해당 하 는 컨트롤 을 자동 으로 표시 합 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- ID, -->
<TextView
android:id="@+id/tv_subject_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:visibility="gone" />
<!-- ID, -->
<TextView
android:id="@+id/tv_subject_item_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:visibility="gone" />
<!-- ,true , , -->
<TextView
android:id="@+id/tv_is_multi_choice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:visibility="gone" />
<!-- , , -->
<TextView
android:id="@+id/tv_subject_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:textSize="14sp"
android:textColor="#1387DD"
android:textStyle="bold"
android:text="" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<!-- -->
<TextView
android:id="@+id/tv_subject_item_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical" />
<!-- CheckBox -->
<CheckBox
android:id="@+id/cb_subject_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="center_vertical" />
<!-- RadioButton -->
<RadioButton
android:id="@+id/rb_subject_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="center_vertical" />
</LinearLayout>
</LinearLayout>
ListView 를 보 여 주 는 레이아웃 정의listview 를 보 여 주 는 레이아웃 layou 를 정의 합 니 다.파일 이름 은 listview 입 니 다.subject_activity.xml
여기에 Relative Layout 레이아웃 을 사용 하여 제출 단 추 를 화면 아래쪽 에 고정 시 켜 사용자 가 투표 정 보 를 제출 할 수 있 도록 합 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff" >
<RelativeLayout
android:id="@+id/rl_head"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_alignParentTop="true"
android:background="#0C99EF"
android:paddingLeft="10dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=" "
android:textColor="#ffffffff"
android:textSize="16sp" />
</RelativeLayout>
<!-- ListView -->
<ListView
android:id="@+id/lv_subject"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/rl_head"
android:layout_marginBottom="50dp"
android:layout_marginLeft="10dp" >
</ListView>
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:text=" " />
</RelativeLayout>
데이터 어댑터 SubjectAdapter 정의listview_subject_activity.xml 파일 은 lv 로 정의 되 었 습 니 다.subject 의 ListView,이 ListView 는 listview 컨트롤 의 열 마다 view 의 레이아웃 listviewsubject_item.xml 와 연결 되 고 투표 테마 항목 의 데이터 원본 을 정 의 했 습 니 다.listview 와 어떻게 연결 하 는 지,이 를 완성 하려 면 Apdater 어댑터 류 에 의존 해 야 합 니 다.
ListView 컨트롤 은 방법 을 통 해 setAdapter 와 Adapter 를 연결 합 니 다.
Adapter 에서 getView 방법 과 열 view 를 통한 레이아웃 listviewsubject_item.xml 연결.
데이터 원본 은 Adapter 의 사용자 정의 구조 함수 의 매개 변 수 를 통 해 Adapter 를 전달 합 니 다.
package com.example.listviewcheckbox.adapter;
import java.util.HashMap;
import java.util.List;
import com.example.listviewcheckbox.R;
import com.example.listviewcheckbox.entity.SubjectItem;
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.RadioButton;
import android.widget.TextView;
public class SubjectAdapter extends BaseAdapter {
private List<SubjectItem> list;
private Context context;
// ,
private HashMap<String,Boolean> subjectItemMap;
private LayoutInflater inflater;
public class ViewHolder{
// id
public TextView tvSubjectId;
//
public TextView tvSubjectName;
//
public TextView tvSubjectItemName;
// id
public TextView tvSubjectItemId;
// ( )
public TextView tvIsMultiChoice;
// CheckBox ( )
public CheckBox cbSubjectItem;
// RadioButton ( )
public RadioButton rbSubjectItem;
}
public SubjectAdapter(List<SubjectItem> list,Context context)
{
this.list=list;
this.context=context;
inflater = LayoutInflater.from(context);
this.subjectItemMap=new HashMap<String, Boolean>();
// subjectItemMap,
for (int i = 0; i < list.size(); i++) {
this.subjectItemMap.put(list.get(i).getItemId(), false);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder = null;
SubjectItem item = list.get(position);
if(convertView!=null&&convertView.getId()==R.id.lv_subject)
{
viewHolder=(ViewHolder)convertView.getTag();
}
else {
viewHolder = new ViewHolder();
convertView=inflater.inflate(R.layout.listview_subject_item, null);
viewHolder.tvSubjectId=(TextView)convertView.findViewById(R.id.tv_subject_id);
viewHolder.tvSubjectName=(TextView) convertView.findViewById(R.id.tv_subject_name);
viewHolder.tvSubjectItemId = (TextView) convertView.findViewById(R.id.tv_subject_item_id);
viewHolder.tvSubjectItemName = (TextView) convertView.findViewById(R.id.tv_subject_item_name);
viewHolder.cbSubjectItem = (CheckBox) convertView.findViewById(R.id.cb_subject_item);
viewHolder.rbSubjectItem = (RadioButton) convertView.findViewById(R.id.rb_subject_item);
viewHolder.tvIsMultiChoice = (TextView) convertView.findViewById(R.id.tv_is_multi_choice );
}
// ,
if(item.getSubjectName().equals(""))
{
viewHolder.tvSubjectName.setVisibility(View.GONE);
}
else {
viewHolder.tvSubjectName.setText(item.getSubjectName());
}
viewHolder.tvSubjectItemId.setText(item.getItemId());
viewHolder.tvSubjectId.setText(item.getSubjectId());
viewHolder.tvSubjectItemName.setText(item.getItemName());
viewHolder.tvIsMultiChoice.setText(item.getIsMultiChoice().toString());
//
if(item.getIsMultiChoice().toString().equals("true"))
{
viewHolder.cbSubjectItem.setVisibility(View.VISIBLE);
viewHolder.rbSubjectItem.setVisibility(View.GONE);
viewHolder.cbSubjectItem.setChecked(this.subjectItemMap.get(item.getItemId()));
}
//
else {
viewHolder.cbSubjectItem.setVisibility(View.GONE);
viewHolder.rbSubjectItem.setVisibility(View.VISIBLE);
viewHolder.rbSubjectItem.setChecked(this.subjectItemMap.get(item.getItemId()));
}
convertView.setTag(viewHolder);
return convertView;
}
/**
*
* @return
*/
public HashMap<String,Boolean> getSubjectItemMap() {
return this.subjectItemMap;
}
}
투표 항목 을 표시 할 Activity 구성 요 소 를 정의 합 니 다.마지막 으로 우 리 는 투표 항목 을 표시 할 Activity 구성 요 소 를 정의 합 니 다.
선택 한 항목 을 선택 한 후 같은 테마 에서 선택 한 항목 을 취소 하 는 것 을 해결 하기 위해 서 맵(radio Button Selected Maps)을 정의 하여 선택 한 테마 에 대한 항목 정 보 를 저장 합 니 다.key 는 선택 한 테마 ID 이 고 value 는 선택 한 항목 ID 입 니 다.
이렇게 하면 사용자 가 선택 한 항목 을 선택 할 때 프로그램 은 Subject Adapter 대상 에서 subject ItemMap 이 항목 테마 전에 선택 한 항목 의 상 태 를 false 로 설정 한 다음 현재 선택 한 항목 을 true 로 설정 한 다음 ListView 를 업데이트 하여 단일 선택 효 과 를 실현 합 니 다.
public class SubjectActivity extends Activity {
private ListView lvSubject;
private SubjectAdapter subjectAdapter;
private List<SubjectItem> list;
private Button btnAdd;
// ,
private HashMap<String, String> radioButtonSelectedMaps;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_subject_activity);
lvSubject = (ListView) findViewById(R.id.lv_subject);
btnAdd = (Button) findViewById(R.id.btn_add);
//
list = DataService.getSubjectItems();
subjectAdapter = new SubjectAdapter(list, this);
lvSubject.setAdapter(subjectAdapter);
radioButtonSelectedMaps = new HashMap<String, String>();
//
btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String selectValues=" :";
// ,
for (int i = 0; i < list.size(); i++) {
if(subjectAdapter.getSubjectItemMap().get(list.get(i).getItemId()))
{
selectValues+=" ID:"+list.get(i).getItemId()+" :"+list.get(i).getItemName();
}
}
Toast.makeText(SubjectActivity.this, selectValues.equals(" :")?" ":selectValues, Toast.LENGTH_LONG).show();
}
});
// ListView
lvSubject.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
ViewHolder viewHolder = (ViewHolder) view.getTag();
//
if (viewHolder.tvIsMultiChoice.getText().equals("true")) {
viewHolder.cbSubjectItem.toggle();
subjectAdapter.getSubjectItemMap().put(viewHolder.tvSubjectItemId.getText().toString(),viewHolder.cbSubjectItem.isChecked());
}
// ,
else {
String currentSubjectIdSelected=viewHolder.tvSubjectId.getText().toString();
String currentSubjectItemId=viewHolder.tvSubjectItemId.getText().toString();
// ,
if (radioButtonSelectedMaps.containsKey(currentSubjectIdSelected)) {
subjectAdapter.getSubjectItemMap().put(radioButtonSelectedMaps.get(currentSubjectIdSelected),false);
}
//
radioButtonSelectedMaps.put(currentSubjectIdSelected,currentSubjectItemId);
viewHolder.rbSubjectItem.toggle();
subjectAdapter.getSubjectItemMap().put(currentSubjectItemId,viewHolder.rbSubjectItem.isChecked());
// ListView
updateListView();
}}});
}
/**
* ListView
*/
private void updateListView()
{
subjectAdapter.notifyDataSetChanged();
}
}
투표 결과 가 져 오기
//
btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String selectValues=" :";
// ,
for (int i = 0; i < list.size(); i++) {
if(subjectAdapter.getSubjectItemMap().get(list.get(i).getItemId()))
{
selectValues+=" ID:"+list.get(i).getItemId()+" :"+list.get(i).getItemName();
}
}
Toast.makeText(SubjectActivity.this, selectValues.equals(" :")?" ":selectValues, Toast.LENGTH_LONG).show();
}
});
코드 다운로드:https://github.com/zoupeiyang/ListViewCheckBox이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.