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