728x90

안드로이드 Checkbox

- isChecked () 메소드를 통해 체크 박스가 선택되어 있는지를 확인할 수 있다.
- setChecked () 메소드를 통해 상태값을 지정할 수 있다.
- 체크된 상태가 변경될 경우에는 onCheckedChanged () 메소드가 자동으로 호출되어 후작업을 하게 된다.
  onCheckedChanged ()메소드에 실제 동작을 추가하기 위해서는
  setOnCheckedChangeListener () 메소드를 통해 OnCheckedChangeListener 인터페이스를 구현하여 추가하면 된다.

checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
if(checkBox1.isChecked()){
    textView1.setText("체크박스 선택됨");
} else {
    textView1.setText("체크박스 선택 취소됨");
}


ListView Checkbox 에 대한 자료를 검색하면 http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html 를 많이들 추천하고 있다.

테스트 해 본 결과 만족스러운 결과를 얻을 수 없었다.


ListView 에 Checkbox를 포함시켜서 스크롤 시키면 체크박스 상태가 변한다.

Adapter 는 자체적으로 메모리를 유연하게 사용하기 위해서 자동으로 화면 바깥쪽으로 벗어난 Adapter 객체를 반대쪽으로 이동시켜 재사용한다.


체크박스 객체 자체를 ArrayList, Hashmap 등에 담아서 사용해 봤는데 해결이 안된다.

많은 자료들을 검색하고 테스트 해보는 중인데 어렵다. 3주동안 해결을 못했다는 내용도 있더라.


스크롤뷰 문제만 빼면 나머지 부분은 성공(?)된 기능이라고 볼 수 있다.

- 전체 선택 및 해제 : 잘 됨

- 부분 선택 및 해제 : 스크롤이 안된 상태에서는 정상, 스크롤 하면 데이터가 꼬여버림.


서버에서 가져온 데이터를 ArrayList 에 저장하고 저장된 데이터 중에서 체크된 것만 뽑아내는 로직이다.

이 로직은 검증용으로 활용하기 위한 용도다.

StringBuffer responseText = new StringBuffer();
responseText.append("The following were checkBoxState...");
for(int i=0;i<arrayList.size();i++){
    if(arrayList.get(i).isCheckBoxState() == true){
        responseText.append("\n" + arrayList.get(i).getUid());
    }
}
Toast.makeText(getApplicationContext(),responseText, Toast.LENGTH_LONG).show();
 



해결방안 : 아래 소스를 http://blog.naver.com/akdlqnsl/220469620347 참조/수정하면 해결 가능하다.

이 소스를 통해서 체크박스 선택에 문제가 없다는 걸 확인했다.

다른 게시글에 나온 방법들로는 해결을 못했다. 내가 구현한 ListViewAdatapter 생성자 구현방법이 위 예제에 나온 것들과 달라서 에러가 발생하더라.

체크박스 처리하는 부분을 구현해보면서 ListViewAdapter 에 대한 이해를 좀 더 할 수 있게 되었다.

ArrayList, Hashmap 에 대한 것을 더 많이 테스트해보고 완벽하게 이해하는 것이 다양한 응용을 가능하게 할 수 있을 거 같다.


public class Address_Item {
    // PersonData 정보를 담고 있는 객체 생성
    private String profile_image; // 이미지 경로를 String으로 받기 위해서
    private String uid;
    private String name;
    private String mobileNO;
    private String officeNO;
    boolean checkBoxState;

    public Address_Item() {
    }

    public Address_Item(String profile_image, String uid, String name, String mobileNO, String officeNO, boolean checkBoxState) {
        this.profile_image = profile_image;
        this.uid = uid;
        this.name = name;
        this.mobileNO = mobileNO;
        this.officeNO = officeNO;
        this.checkBoxState = checkBoxState;
    }

    public String getProfile_image() {
        return profile_image;
    }

    public void setProfile_image(String profile_image) {
        this.profile_image = profile_image;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMobileNO() {
        return mobileNO;
    }

    public void setMobileNO(String mobileNO) {
        this.mobileNO = mobileNO;
    }

    public String getOfficeNO() {
        return officeNO;
    }

    public void setOfficeNO(String officeNO) {
        this.officeNO = officeNO;
    }

    public boolean isCheckBoxState() {
        return checkBoxState;
    }

    public void setCheckBoxState(boolean checkBoxState) {
        this.checkBoxState = checkBoxState;
    }
}


=== MainActivity.java ====


import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.telephony.PhoneNumberUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "AppPermission";
    public SharedPreferences settings;
    private ListView listView; // 리스트뷰
    private EditText editText;
    private Button btn_search;
    private Button btn_chatting;
    private Button btn_msg;

    private ArrayList<Address_Item> arrayList = null; // 데이터 리스트
    static ListViewAdapter listViewAdapter = null; // 리스트뷰에 사용되는 ListViewAdapter
    ProgressDialog mProgressDialog;

    static boolean isMSG = false;
    static boolean isAll = false;
    static boolean flag = false;
    static CheckBox check_all;

    RelativeLayout relative1;
    RelativeLayout relative2;

    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this.getBaseContext();

        isMSG = false;
        isAll = false;

        editText = (EditText) findViewById(R.id.et_text01);

        // Relative layout 정의
        relative1 = (RelativeLayout) findViewById(R.id.list_view_relative1);
        relative2 = (RelativeLayout) findViewById(R.id.list_view_relative2);

        // Adapter에 추가 데이터를 저장하기 위한 ArrayList
        arrayList = new ArrayList<Address_Item>(); // ArrayList 생성

        listView = (ListView) findViewById(R.id.my_listView);
        listViewAdapter = new ListViewAdapter(this); // Adapter 생성
        listView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

        btn_search = (Button) findViewById(R.id.btn_search);
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                settings = getSharedPreferences("settings", Activity.MODE_PRIVATE);
                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("search", editText.getText().toString().trim())
                        .appendQueryParameter("idx", "2"); // settings.getString("idx","" )
                String postParams = builder.build().getEncodedQuery();
                new getJSONData().execute(Value.IPADDRESS + "/get_json.php", postParams);
                hideSoftKeyboard();
            }
        });

        if (isMSG == false) {
            relative1.setVisibility(View.VISIBLE);
            relative2.setVisibility(View.GONE);
        } else if (isMSG == true) {
            relative1.setVisibility(View.GONE);
            relative2.setVisibility(View.VISIBLE);
        }

        btn_msg = (Button) findViewById(R.id.lv_btn_msg);
        btn_msg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isMSG = true;
                relative1.setVisibility(View.GONE);
                relative2.setVisibility(View.VISIBLE);
                listViewAdapter.notifyDataSetChanged();
            }
        });

        // all checkbox
        check_all = (CheckBox) findViewById(R.id.lv_checkbox_all);
        check_all.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (check_all.isChecked() == false) {
                    isAll = false;
                    listViewAdapter.setAllChecked(check_all.isChecked());
                    listViewAdapter.notifyDataSetChanged();
                } else if (check_all.isChecked() == true) {
                    isAll = true;
                    listViewAdapter.setAllChecked(check_all.isChecked());
                    listViewAdapter.notifyDataSetChanged();
                }
            }
        });

        Button calcel = (Button) findViewById(R.id.btn_cancle);
        calcel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isMSG = false;
                relative1.setVisibility(View.VISIBLE);
                relative2.setVisibility(View.GONE);
                listViewAdapter.setAllChecked(false);
                check_all.setChecked(false); // 전체 선택 체크박스 해제
                listViewAdapter.notifyDataSetChanged();
            }
        });

        Button send = (Button) findViewById(R.id.btn_send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                StringBuffer responseText = new StringBuffer();
                responseText.append("The following were selected...");
                for(int i=0;i<arrayList.size();i++){
                    if(arrayList.get(i).isCheckBoxState() == true){
                        responseText.append("\n" + arrayList.get(i).getUid());
                    }
                }
                Toast.makeText(getApplicationContext(),responseText, Toast.LENGTH_LONG).show();
            }
        });

    }

    private void hideSoftKeyboard() { // 소프트 키보드 숨기기
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getApplicationWindowToken(), 0);
    }

    class getJSONData extends AsyncTask<String, Void, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle("Personal Profile JSON Parse");
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();  // Show progressdialog
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                return PHPComm.getJson(params[0], params[1]);
            } catch (Exception e) {
                return new String("Exception: " + e.getMessage());
            }
        }

        protected void onPostExecute(String result) {
            searchJSON = result;
            showList();
            mProgressDialog.dismiss();
        }
    }

    // 서버 정보를 파싱하기 위한 변수 선언
    String searchJSON;
    private static final String TAG_RESULTS = "result";
    private static final String TAG_UID = "uid"; // 서버 테이블의 실제 필드명
    private static final String TAG_NAME = "name";
    private static final String TAG_MobileNO = "mobileNO";
    private static final String TAG_OfficeNO = "officeNO";
    private static final String TAG_Image = "photo"; // 이미지 필드
    JSONArray peoples = null;

    protected void showList() {
        try {
            JSONObject jsonObj = new JSONObject(searchJSON);
            peoples = jsonObj.getJSONArray(TAG_RESULTS);

            arrayList.clear(); // 서버에서 가져온 데이터 초기화
            for (int i = 0; i < peoples.length(); i++) {
                JSONObject c = peoples.getJSONObject(i);
                final String uid = c.getString(TAG_UID);
                final String name = c.getString(TAG_NAME);
                final String mobileNO = c.getString(TAG_MobileNO);
                final String officeNO = c.getString(TAG_OfficeNO);
                final String Profile_Image = c.getString(TAG_Image);

                // 서버에서 가져온 데이터 저장
                listViewAdapter.addItem(Profile_Image, uid, name, mobileNO, officeNO, false);
            }

            runOnUiThread(new Runnable() { // 화면에 반영하기 위하여 runOnUiThread()를 호출하여 실시간 갱신한다.
                @Override
                public void run() {
                    // 갱신된 데이터 내역을 어댑터에 알려줌
                    listViewAdapter.notifyDataSetChanged();
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    class ViewHolder {
        public LinearLayout child_layout;
        public ImageView profile_Image;
        public TextView tv_name;
        public TextView tv_mobileNO;
        public TextView tv_officeNO;
        public ImageView child_btn;
        public CheckBox checkbox;
    }

    private class ListViewAdapter extends BaseAdapter {
        ImageLoader imageLoader;
        Context mContext;

        public ListViewAdapter(Context context) {
            this.mContext = context;
            imageLoader = new ImageLoader(context);
        }

        // CheckBox를 모두 선택하는 메서드
        public void setAllChecked(final boolean ischeked) {
            final int tempSize = arrayList.size();
            if(ischeked == true){
                for (int ia = 0; ia < tempSize; ia++) {
                    arrayList.get(ia).setCheckBoxState(true);
                    notifyDataSetChanged();
                }
            } else {
                for (int a = 0; a < tempSize; a++) {
                    arrayList.get(a).setCheckBoxState(false);
                    notifyDataSetChanged();
                }
            }
        }

        // 아이템 데이터 추가를 위한 메소드
        public void addItem(String profile_image, String uid, String name, String mobileNO, String officeNO, boolean checkItem_flag) {
            Address_Item item = new Address_Item();
            item.setProfile_image(profile_image);
            item.setUid(uid);
            item.setName(name);
            item.setMobileNO(mobileNO);
            item.setOfficeNO(officeNO);
            item.setCheckBoxState(checkItem_flag);

            arrayList.add(item);
        }
    }


        @Override
        public int getCount() {
            return arrayList.size(); // 데이터 개수 리턴
        }

        @Override
        public Object getItem(int position) {
            return arrayList.get(position);
        }

        // 지정한 위치(position)에 있는 데이터 리턴
        @Override
        public long getItemId(int position) {
            return position;
        }

        // position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
            final Context context = parent.getContext();
            final int checkBoxPosition = position;
            final Integer index = Integer.valueOf(position);

            // PersonData 에서 position 에 위치한 데이터 참조 획득
            final Address_Item addressItem = arrayList.get(position);

            // 화면에 표시될 View
            if (convertView == null) {
                viewHolder = new ViewHolder();

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.address_item, parent, false);

                convertView.setBackgroundColor(0x00FFFFFF);
                convertView.invalidate();

                // 화면에 표시될 View 로부터 위젯에 대한 참조 획득
                viewHolder.profile_Image = (ImageView) convertView.findViewById(R.id.profile_Image);
                viewHolder.tv_name = (TextView) convertView.findViewById(R.id.child_name);
                viewHolder.tv_mobileNO = (TextView) convertView.findViewById(R.id.child_mobileNO);
                viewHolder.tv_officeNO = (TextView) convertView.findViewById(R.id.child_officeNO);
                viewHolder.child_btn = (ImageView) convertView.findViewById(R.id.child_Btn);
                viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.list_cell_checkbox);
                if(viewHolder.checkbox != null){
                    // 체크박스의 상태 변화를 체크한다.
                    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                            int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                            arrayList.get(index).setSelected(buttonView.isChecked());
                        }
                    });
                }

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            // 아이템 내 각 위젯에 데이터 반영
            if (addressItem.getProfile_image().equals("")) {
                final Bitmap Base_Profile = PHPComm.autoresize_decodeResource(getResources(), R.mipmap.photo_base, 160);
                viewHolder.profile_Image.setImageBitmap(Base_Profile);
            } else {
                String photoURL = Value.IPADDRESS + "/photos/" + addressItem.getProfile_image();
                imageLoader.DisplayImage(photoURL, viewHolder.profile_Image);
            }

            viewHolder.tv_name.setText(addressItem.getName());
            viewHolder.tv_mobileNO.setText(PhoneNumberUtils.formatNumber(addressItem.getMobileNO()));
            viewHolder.tv_officeNO.setText(PhoneNumberUtils.formatNumber(addressItem.getOfficeNO()));

            if (isMSG == false) {
                viewHolder.child_btn.setVisibility(View.VISIBLE);
                viewHolder.child_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                       
                    }
                });
                viewHolder.checkbox.setVisibility(View.GONE);
                convertView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(getApplicationContext(), "상세보기를 눌렀습니다 ===" + addressItem.getUid(), Toast.LENGTH_SHORT).show();
                    }
                });
            } else {
                if (isMSG == true) {
                    convertView.setOnClickListener(null); // 체크박스가 활성화되면 convertView 클릭 리스너 비활성화
                    viewHolder.child_btn.setVisibility(View.GONE);
                    //convertView.setClickable(false);
                    viewHolder.checkbox.setVisibility(View.VISIBLE);
                    viewHolder.checkbox.setTag(position); // This line is important.
                    //viewHolder.checkbox.setChecked(false);

                }
            }

            // 체크된 아이템인지 판단할 boolean 변수
            for(int i=0; i < arrayList.size();i++){
                if(arrayList.get(i).isCheckBoxState() == true){
                    viewHolder.checkbox.
setCheckBoxState(true);
                } else {
                    viewHolder.checkbox.
setCheckBoxState(false);
                }
                notifyDataSetChanged();
            }

            return convertView;
        }

}

블로그 이미지

Link2Me

,