Android ListView 는 단일 선택 과 다 중 선택 을 지원 하 는 투표 항목 을 구축 합 니 다.

18768 단어 Android투표 하 다.
머리말
저 희 는 안 드 로 이 드 앱 개발 에서 사용자 가 선택 할 수 있 는 옵션 목록 을 제공 하 는 수 요 를 만 날 수 있 습 니 다.예 를 들 어 투표 유형의 프로젝트 에서 저 희 는 일부 주 제 를 사용자 에 게 선택 할 수 있 습 니 다.각 주 제 는 몇 가지 옵션 이 있 고 사용 자 는 이러한 주제 의 옵션 을 선택 한 후에 제출 합 니 다.
본 고 는 단일 선거 와 다 중 투표 항목 을 지원 하 는 것 을 예 로 들 어 하나의 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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기