본문 바로가기

Android/Listview

안드로이드/Android AdapterView.onItemClickListener 사용법


 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.1  
   API LEVEL : 7 
   이클립스 버젼 : Indigo
   테스트단말 : 삼성갤럭시 S2



안드로이드/Android AdapterView.onItemClickListener 사용법


ListView를 사용하여 작업을 하게 되는 경우, 각각의 Row(행)에 이벤트를 걸어야 할 경우가 생기는 데요. 이럴때 보통 AdapterView.onItemClickListener 를 이용하여, 이벤트 처리를 해주게 됩니다. 하지만 보통 position 값만을 사용하여 코딩하게 되는 경우가 많은데요. 간단하게 onItemClickListener 대해서 알아보겠습니다.


우선 onItemClickListener는 CallBack Listener 입니다. 여기서 말하는 CallBack 란 무엇일까요? CallBack 이란 내가 ListView의 한 Row(행)을 클릭했을 때, 시스템 에서 내가 클릭한 것에 대한 반응을 다시 나에게 알려주는 것을 말합니다. 쉽게 말해 "내가 클릭하면, 시스템이 그에 대한 반응을 해준다" 라고 말할 수 있겠네요. ㅎㅎ 간단하죠?


그렇기 때문에 내가 ListView의 Row를 클릭했을 경우에 그 Row에 해당하는 position, view, adapterview 등을 시스템에서 나에게 전달해 주는 것입니다. 그럼 이제 이해 하기가 훨씬 쉽겠죠?ㅎ



그럼 바로 onItemClickListener 를 사용한 예제를 보겠습니다.


private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long l_position) {
			// parent는 AdapterView의 속성의 모두 사용 할 수 있다.
			String tv = (String)parent.getAdapter().getItem(position);
			Toast.makeText(getApplicationContext(), tv, Toast.LENGTH_SHORT).show();
			
			// view는 클릭한 Row의 view를 Object로 반환해 준다.
			TextView tv_view = (TextView)view.findViewById(R.id.tv_row_title);
			tv_view.setText("바꿈");
			
			// Position 은 클릭한 Row의 position 을 반환해 준다.
			Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show();
			// l_Position 은 클릭한 Row의 long type의 position 을 반환해 준다.
			Toast.makeText(getApplicationContext(), "l = " + l_position, Toast.LENGTH_SHORT).show();
		}
	};



위에서 설명한 것과 같이 ListView의 Row(행)를 클릭했을 경우, AdapterView.OnItemClickListener 인 CallBack Listener를 등록했기 때문에, 시스템에서 값을 반환해 줍니다. 그러므로 반환 되는 매가 인자를 들을 활용해서 더욱 효과적인 코딩을 할 수 있 게 됩니다.


또한 중요한 것은,!!! 커스텀 Dialog에 ListView를 사용한 구조라면, Dialog 생성자에 위의 mItemClickListener 를 넘겨줘서 처리 한다면, Dialog를 호출한 Activity 안에서 포지션 처리 할 수 가 있습니다. 

또한 AdapterView.OnItemClickListener 를 메서드로 만들지 않고, implements로 구현한 클래스를 사용해서 넘겨 주셔되 됩니다.






전체 소스 입니다.


package arabiannight.tistory.com.onitemclicklistener;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class TestOnItemClickListenerActivity extends Activity {
	
	private String[] mContents = {"사자", "여우", "곰", "호랑이", "타조"
			, "말", "돼지", "사슴", "콩나물", "살쾡이", "푸우", "티몬"};
	private ListView mListView;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mListView = (ListView) findViewById(R.id.lv_list);
        mListView.setAdapter(new CustomArrayAdapter(this, R.layout.row, mContents));
        mListView.setOnItemClickListener(mItemClickListener);
    }
    
    
    private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long l_position) {
			// parent는 AdapterView의 속성의 모두 사용 할 수 있다.
			String tv = (String)parent.getAdapter().getItem(position);
			Toast.makeText(getApplicationContext(), tv, Toast.LENGTH_SHORT).show();
			
			// view는 클릭한 Row의 view를 Object로 반환해 준다.
			TextView tv_view = (TextView)view.findViewById(R.id.tv_row_title);
			tv_view.setText("바꿈");
			
			// Position 은 클릭한 Row의 position 을 반환해 준다.
			Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show();
			// l_Position 은 클릭한 Row의 long type의 position 을 반환해 준다.
			Toast.makeText(getApplicationContext(), "l = " + l_position, Toast.LENGTH_SHORT).show();
		}
	};
    
    
    class CustomArrayAdapter extends ArrayAdapter {
    	 
        private LayoutInflater inflater = null;
        private ViewHolder viewHolder = null;
     
        public CustomArrayAdapter(Context c, int textViewResourceId, 
                String[] strings) {
            super(c, textViewResourceId, strings);
            this.inflater = LayoutInflater.from(c);
        }
     
        @Override
        public int getCount() {
            return super.getCount();
        }
     
        @Override
        public String getItem(int position) {
            return super.getItem(position);
        }
     
        @Override
        public long getItemId(int position) {
            return super.getItemId(position);
        }
     
        @Override
        public View getView(int position, View convertview, ViewGroup parent) {
             
            View v = convertview;
             
            if(v == null){
            	viewHolder = new ViewHolder();
                v = inflater.inflate(R.layout.row, null);
                viewHolder.tv_title = (TextView) v.findViewById(R.id.tv_row_title);
                
                v.setTag(viewHolder);
            
            }else {
            	viewHolder = (ViewHolder)v.getTag();
            }
            
            viewHolder.tv_title.setText(getItem(position));
            
            return v;
        }
    }
    
    class ViewHolder {
    	public TextView tv_title;
    }
}
//




파일첨부 : 


TestOnItemClickListener.zip




스크린샷 :