마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커스텀 리스트뷰 헤더 추가 질문입니다..

0 추천

http://stackoverflow.com/questions/16601800/custom-list-view-with-custom-headers-android

위와 같이 카테고리별로 커스텀리스트뷰(주소록)에 있는 아이템들을 만약에 ㄱ이면 ㄱ으로 시작하는 이름을 가진 아이템 ㄴ이면 ㄴ으로 시작하는 아이템을 카테고리별로 묶고 싶은데 어떤식으로 해야 하는지 잘 모르겠습니다.. 아래 코드 첨부 합니다.

 

public class MainActivity extends AppCompatActivity {

    public class ListView_Adapter extends BaseAdapter implements View.OnClickListener {

        // Activity에서 가져온 객체정보를 저장할 변수
        private ListView_User mUser;
        private Context mContext;

        // ListView 내부 View들을 가르킬 변수들
        private ImageView imgUserIcon;
        private TextView tvUserName;
        private TextView tvUserPhoneNumber;
        private ImageButton btnSend;
        private ImageButton btnMail;

        // 리스트 아이템 데이터를 저장할 배열
        protected ArrayList<ListView_User> mUserData;

        public ListView_Adapter(Context context) {
            super();
            mContext = context;
            mUserData = new ArrayList<ListView_User>();
        }

        @Override
        /**
         * @return 아이템의 총 개수를 반환
         */
        public int getCount() {
            // TODO Auto-generated method stub
            return mUserData.size();
        }

        @Override
        /**
         * @return 선택된 아이템을 반환
         */
        public ListView_User getItem(int position) {
            // TODO Auto-generated method stub
            return mUserData.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        /**
         * getView
         *
         * @param position - 현재 몇 번째로 아이템이 추가되고 있는지 정보를 갖고 있다.
         * @param convertView - 현재 사용되고 있는 어떤 레이아웃을 가지고 있는지 정보를 갖고 있다.
         * @param parent - 현재 뷰의 부모를 지칭하지만 특별히 사용되지는 않는다.
         * @return 리스트 아이템이 저장된 convertView
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View v = convertView;

            // 리스트 아이템이 새로 추가될 경우에는 v가 null값이다.
            // view는 어느 정도 생성된 뒤에는 재사용이 일어나기 때문에 효율을 위해서 해준다.
            if (v == null) {
                // inflater를 이용하여 사용할 레이아웃을 가져옵니다.
                v = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_item, null);

                // 레이아웃이 메모리에 올라왔기 때문에 이를 이용하여 포함된 뷰들을 참조할 수 있습니다.
                imgUserIcon = (ImageView) v.findViewById(R.id.user_icon);
                tvUserName = (TextView) v.findViewById(R.id.user_name);
                tvUserPhoneNumber = (TextView) v.findViewById(R.id.user_phone_number);
                btnSend = (ImageButton) v.findViewById(R.id.btn_send);
                btnMail = (ImageButton)v.findViewById(R.id.btn_mail);
            }

            // 받아온 position 값을 이용하여 배열에서 아이템을 가져온다.
            mUser = getItem(position);

            // Tag를 이용하여 데이터와 뷰를 묶습니다.
            btnSend.setTag(mUser);
            btnMail.setTag(mUser);

            // 데이터의 실존 여부를 판별합니다.
            if (mUser != null) {
                // 데이터가 있다면 갖고 있는 정보를 뷰에 알맞게 배치시킵니다.

                imgUserIcon.setImageResource(mUser.getUserIcon());
                tvUserName.setText(mUser.getUserName());
                tvUserPhoneNumber.setText(mUser.getUserPhoneNumber());

                btnSend.setFocusable(false);
                btnMail.setFocusable(false);
                btnSend.setOnClickListener(this);
                btnMail.setOnClickListener(this);
            }
            // 완성된 아이템 뷰를 반환합니다.
            return v;
        }

        // 데이터를 추가하는 것을 위해서 만들어 준다.
        public void add(ListView_User user) {
            mUserData.add(user);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            // Tag를 이용하여 Data를 가져옵니다.
            ListView_User clickItem = (ListView_User) v.getTag();

            switch (v.getId()) {
                case R.id.btn_send:
                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                    {
                        int permissionResult = mContext.checkSelfPermission(Manifest.permission.CALL_PHONE);

                        if (permissionResult == PackageManager.PERMISSION_DENIED) {
                            if(shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
                                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                                dialog.setTitle("권한이 필요합니다")
                                        .setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화 걸기\" 권한이 필요합니다. 계속 하시겠습니까?")
                                        .setPositiveButton("네", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialogInterface, int which) {
                                                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                                    requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
                                                }
                                            }
                                        })
                                        .setNegativeButton("아니오", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialogInterface, int which) {
                                                Toast.makeText(mContext,"기능을 취소했습니다.",Toast.LENGTH_SHORT).show();
                                            }
                                        })
                                        .create().show();
                            }
                            else {
                                requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
                            }
                        }
                        else {
                            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + clickItem.getUserPhoneNumber()));
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            mContext.startActivity(intent);
                        }
                    }
                    else {
                        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + clickItem.getUserPhoneNumber()));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        mContext.startActivity(intent);
                    }

                    Toast.makeText(mContext, clickItem.getUserPhoneNumber(), Toast.LENGTH_SHORT).show();
                    break;
                  /*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:" + clickItem.getUserPhoneNumber()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mContext.startActivity(intent);*/

                case R.id.btn_mail:
                    Intent mIntent = new Intent(Intent.ACTION_SENDTO,Uri.parse("mailto:" + clickItem.getUserMail()));
                    mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mContext.startActivity(mIntent);
                    Toast.makeText(mContext, clickItem.getUserMail(), Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

 

익명사용자 님이 2017년 7월 18일 질문

1개의 답변

0 추천
stickylistview 라고 검색하시면 많은 정보를 얻을 수 있습니다.
ThisPlus (46,920 포인트) 님이 2017년 7월 18일 답변
...