import java.util.ArrayList;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

public class CLMperson_pushselection extends ListActivity {

 String tag = "push_selection";
 
 ArrayList<PersonPush> m_pList;
 int ppos;
 
 class PersonPush 
 {
  private String name;
  private String phone_num;
  public int time;
  
  public PersonPush(String _name, String _number){
   this.name = _name;
   this.phone_num = _number;
   this.time = 0;
  }
  
  public String getName(){
   return name;
  }
  public String getNumber(){
   return phone_num;
  }
 }
 
 private class pushSelectAdapter extends ArrayAdapter<PersonPush> {
  private ArrayList<PersonPush> items;
  private int pos;
  private Activity context;
  public  ArrayAdapter<CharSequence> adPushSpin;
  
  public pushSelectAdapter( Context context, int textViewResourceId, ArrayList<PersonPush> items){
   super(context, textViewResourceId, items);
   this.items = items;
   this.context = getParent();
  }

  private PersonPush getModel(int position)
  {
   return(((pushSelectAdapter)getListAdapter()).getItem(position));
  }
  
  @Override
  public View getView(int position, View converView, ViewGroup parent){
   View v = converView;
   ViewWrapper wrapper;
   TextView pushName;
   Spinner pushSpin;
   pos = position;
   
   if( v == null){
    LayoutInflater inflater = context.getLayoutInflater();
    v = inflater.inflate(R.layout.pushselection, null);
    wrapper=new ViewWrapper(v); 
    v.setTag(wrapper);
   }
   else {
    wrapper=(ViewWrapper)v.getTag();
   }
   
   // ViewWrapper 에 있는 Spinner 과 Textview 를 연결
   pushSpin = wrapper.getSpinner();
   pushName = wrapper.getName();
   
   
   // Spinner에 있는 알림을 선택하였을 경우 
   pushSpin.setOnItemSelectedListener(new OnItemSelectedListener()
         {    
          public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
                               
           if( position != 0)
           { // 1달 3달 6달 이 String 이므로 int형으로 바꾸어 주기 위해 순서에 따라 자동으로 선택되게 하였다.
            items.get(pos).time = (position+1)/2*position;
           }
           
          }
        
          public void onNothingSelected(AdapterView<?> arg0){}
   });
           
   // spinner 안의 내용 표시에 대한 설정
   pushSpin.setPrompt("알림 시간을 선택하세요");
   pushSpin.setFocusable(false);
   
   adPushSpin = ArrayAdapter.createFromResource(context, R.array.pushtime, android.R.layout.simple_spinner_item);
   adPushSpin.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
   pushSpin.setAdapter(adPushSpin);
   
   // 연락처에 기록된 이름 출력
   PersonPush m_pp = items.get(position);
   if( m_pp != null && pushName != null){
     pushName.setText(m_pp.getName());
   }
   
   return v;
  }
 }
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.listview);
  ppos = 0;
  
  m_pList = new ArrayList<CLMperson_pushselection.PersonPush>();
 
  Cursor cursor = getURI();
  
  int end = cursor.getCount();    // 전화번호부의 갯수 세기
  String [] name = new String[end]; // 전화번호부의 이름을 저장할 배열 선언
  int count = 0; 

  if(cursor.moveToFirst()) 
  {
   // 컬럼명으로 컬럼 인덱스 찾기 
   int idIndex = cursor.getColumnIndex("_id");

   do 
   {
    // 요소값 얻기
    int id = cursor.getInt(idIndex);   
    name[count] = cursor.getString(1);

    PersonPush p = new PersonPush(name[count], cursor.getString(2));
    m_pList.add(p);
    
    count++;
    
   } while(cursor.moveToNext() || count > end);
  }
  
  pushSelectAdapter m_adapter = new pushSelectAdapter(this, R.layout.pushselection, m_pList);
  setListAdapter(m_adapter);  
  
 }
 
 private Cursor getURI() 
 {
  // 주소록 URI  
  Uri people = Phone.CONTENT_URI;
  
  // 검색할 컬럼 정하기
  String[] projection = new String[] { Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER };
  
  // 쿼리 날려서 커서 얻기
  String[] selectionArgs = null;
  String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

  return managedQuery(people, projection, null, selectionArgs, sortOrder);
 }

 @Override
 public void onListItemClick(ListView parant, View v, int position, long id)
 {
  ppos = position;
  
 }
 
 public void onBackPressed() {  
  CLManagerTab.ManagerTab.back();
 }
 
}







 궁금한 것이 두가지 있습니다.

 1. text + spinner 로 되어있는 list 인데요.
     spinner의 위치를 오른쪽 끝으로 가게할 깔끔한 방법이 없을까요?
    (기기에 상관없이 항상 오른쪽 끝으로)



 2. 제가 spinner의 setOnItemSelectedListener를 수정해서 사용해보고 있습니다.
     제가 원하는 것은  예를 들면

     apple 에 있는 spinner를 눌러서 값을 변경했다면, apple 이란 이름을 가져오고 싶습니다. 
     (apple이 spinner를 통해 어떤 것을 선택했는지 알고싶기 때문에요)

     하지만 getView 에 있는 position과 setOnItemSelectedListener이 호출되는 시점이 서로 맞아 떨어지지 않아서,

     실제로는 apple에 있는 spinner를 클릭했지만, getView의 position은 Pizza를 가르키고 있네요.
     
     onListItemClick 으로 잡아볼려고 시도했지만 spinner를 누르는것으론 현재 text list의 순서를 잡아내진 않더라구요.

    현재 setOnItemSelectedListener는 getView 안에서 구현을 하였습니다.



/ 정말 죄송합니다. 이미지를 첨부하였는데, 글에 곧장 보이게 하는 방법을 몰라서 첨부만 하게되었습니다.
/ 글을 처음 작성하게 되어서... 공지사항 읽음
/ 글에 관한 검색은 제가 시험이 있어서 시험보고 온후에 다시 확인하도록 해보겠습니다.