본문 바로가기

소프트웨어/Android/Java/Ndk

Android] ListActivity에서 OnClickListener 적용시키기

키워드!!: setOnItemClickListener


ListActivity는 ListView와같이 FindViewById를 이용해서 UI 객체를 생성하지 않기때문에 Listener를 적용시킬때 '으잉?'하는 생각을 하게된다. 

예)

//일반적인 ListView일때

ListView listView = (ListView)findViewById(R.id.listView); 

listView.setOnclickListener( new OnItemClickListener() {

            //Do somethings~~

});


//ListActivity를 상속받았을때

class listActivity extends ListActivity {

      .....

listActivity....???? //으잉? 객체검색은...

}


그래서 위의 상황과 같이 ListActivity를 상속받아서 ListView를 출력하였을때는 두가지 해결법이 있다.


1. OnItemClickListener를 implements한다

1-1. method overriding한다. 

2. implements없이 getListView() 매서드를 이용해서

2-1. 무명클래스를 이용해 method overriding한다.


나는 주로 무명클래스를 이용한 method overriding을 이용하기에 이 방식으로 설명하겠다. 원래 1번 형태로 On..Listener를 implements하던 사람이라면 안알려줘도 이정도 키워드면 알아서 할 것이다.


2번을 사용한 전체 구조는 다음과 같다.


public class MainActivity extends ListActivity {


protected void onCreate(Bundle savedInstanceState) {

getListView().setOnItemClickListener(new OnItemClickListener() {


@Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

Log.d("mstag",""+arg0+" "+arg1+" "+arg2+" "+arg3);

}

});

}


}


getListView() method는 

public ListView getListView ()

Added in API level 1

Get the activity's list view widget.

위와같이 ListView를 return하기때문에 객체생성을 하지않은 listActivity에서 listView를 얻을 수 있는것이다.


그리고 overriding한 onItemClick매서드의 인자는..

Public Methods
abstract voidonItemClick(AdapterView<?> parent, View view, int position, long id)
Callback method to be invoked when an item in this AdapterView has been clicked.
이기때문에 세번째 매개변수인 arg2을 이용하면 listView의 Position값을 얻올 수 있다.




참고.. ListActivity를 상속받기위한 Activity XML은 다음과 같다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

        tools:context=".MainActivity" >


    <ListView 

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:id="@android:id/list"

        />


</LinearLayout>