반응형



이전 포스트에서 소개한

ListView에 Context Menu 달기 예제에서

Context Menu는 오래 누르면 나오는 메뉴입니다.


그래서

ListView의 한 항목을 오래 누르는 것을 감지하여

자동으로 콜백 메소드를 호출하는

OnItemLongClickListener를 이용해서 이전 예제를 만들어 보겠습니니다.


선택한 항목에 메뉴가 만들어져야 하기에

Popup Menu를 사용하였습니다.


이전 Context Menu 예제에서는 메뉴가 보여지는 위치가

누른 항목과 상관없이 가운데 였습니다.


이에 비해 이번 예제에서 메뉴가 나타나는 위치는

선택한 항목에서 보여지게 되어 보다

해당 항목의 메뉴라는 느낌이 명확합니다.


다른 부분은 모두 이전 예제와 같고 소스코드만 다르기에

결과만 잠시 보고

소스 코드만 포스팅합니다.


실행화면


Context Menu와 ItemLongClick을 이용한 Popup Menu 차이

  

 



이전 포스트의 Context 메뉴관련 코드를 모두 제거하고

LongClick에 반응하는 코드를 추가합니다.


굵은 글씨가 새로 추가한 코드입니다.

 

 MainActivity.java


public class MainActivity extends Activity {

//대량의 문자열 데이터를 저장할 Arraylist 객체 생성

ArrayList<String> mDatas= new ArrayList<String>();

ListView listview; //ListView 참조변수


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//문자열 데이터 ArrayList에 추가

mDatas.add("KOREA");

mDatas.add("CANADA");

mDatas.add("FRANCE");

mDatas.add("MEXICO");

mDatas.add("POLAND");

mDatas.add("SAUDI ARABIA");

//ListView가 보여줄 뷰를 만들어내는 Adapter 객체 생성

//ArrayAdapter : 문자열 데이터들을 적절한 iew로 1:1로 만들어서 List형태로 ListView에 제공하는 객체

//첫번째 파라미터 : Context객체 ->MainActivity가 Context를 상속했기 때문에 this로 제공 가능

//두번째 파라미터 : 문자열 데이터를 보여줄 뷰. ListView에 나열되는 하나의 아이템 단위의 뷰 모양

//세번째 파라미터 : adapter가 뷰로 만들어줄 대량의 데이터들

//본 예제에서는 문자열만 하나씩 보여주면 되기 때문에 두번째 파라미터의 뷰 모먕은 Android 시스템에서 제공하는

//기본 Layout xml 파일을 사용함.

ArrayAdapter adapter= new ArrayAdapter(this, android.R.layout.simple_list_item_1, mDatas);

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

listview.setAdapter(adapter); //위에 만들어진 Adapter를 ListView에 설정 : xml에서 'entries'속성

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 설정 (Button의 OnClickListener와 같은 역할)

listview.setOnItemClickListener(listener);

//Listview의 아이템 하나가 오래 눌러지는 것을 감지하는 Listener객체 생성(위의 OnItemClickListener같은 역할)

listview.setOnItemLongClickListener(new OnItemLongClickListener() {

//ListView의 아이템 중 하나가 오래 클릭될 때 호출되는 메소드

//첫번째 파라미터 : 오래 눌러진 아이템을 보여주고 있는 AdapterView 객체(여기서는 ListView객체)

//두번째 파라미터 : 오래 눌러진 아이템 뷰

//세번째 파라미터 : 오래 눌러진 아이템의 위치(ListView이 첫번째 아이템(가장위쪽)부터 차례대로 0,1,2,3.....)

//네번재 파리미터 : 오래 눌러진 아이템의 아이디(특별한 설정이 없다면 세번째 파라이터인 position과 같은 값)

@Override

public boolean onItemLongClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

//PopupMenu객체 생성. 

     //생성자함수의 첫번재 파라미터 : Context

     //생성자함수의 두번째 파라미터 : Popup Menu를 붙일 anchor 뷰

     PopupMenu popup= new PopupMenu(MainActivity.this, view);//view는 오래 눌러진 뷰를 의미

    

     //Popup Menu에 들어갈 MenuItem 추가.

     //이전 포스트의 컨텍스트 메뉴(Context menu)처럼 xml 메뉴 리소스 사용

     //첫번재 파라미터 : res폴더>>menu폴더>>menu_listview.xml파일 리소스

     //두번재 파라미터 : Menu 객체->Popup Menu 객체로 부터 Menu 객체 얻어오기

     getMenuInflater().inflate(R.menu.menu_listview, popup.getMenu());

    

     //Popup menu의 메뉴아이템을 눌렀을  때 보여질 ListView 항목의 위치

//Listener 안에서 사용해야 하기에 final로 선언

final int index= position;

     //Popup Menu의 MenuItem을 클릭하는 것을 감지하는 listener 설정

     popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

@Override

public boolean onMenuItemClick(MenuItem item) {

// TODO Auto-generated method stub

//선택된 Popup Menu의  아이템아이디를 구별하여 원하는 작업 수행

//예제에서는 선택된 ListView의 항목(String 문자열) data와 해당 메뉴이름을 출력함

switch( item.getItemId() ){

case R.id.modify:

Toast.makeText(MainActivity.this, mDatas.get(index)+" Modify", Toast.LENGTH_SHORT).show(); break;

case R.id.delete:

Toast.makeText(MainActivity.this, mDatas.get(index)+" Delete", Toast.LENGTH_SHORT).show();

break;

case R.id.info:

Toast.makeText(MainActivity.this, mDatas.get(index)+" Info", Toast.LENGTH_SHORT).show();

break;

}

return false;

}

});

        

     popup.show();//Popup Menu 보이기 

return false;

}

});

}

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 생성 (Button의 OnClickListener와 같은 역할)

OnItemClickListener listener= new OnItemClickListener() {

//ListView의 아이템 중 하나가 클릭될 때 호출되는 메소드

//첫번째 파라미터 : 클릭된 아이템을 보여주고 있는 AdapterView 객체(여기서는 ListView객체)

//두번째 파라미터 : 클릭된 아이템 뷰

//세번째 파라미터 : 클릭된 아이템의 위치(ListView이 첫번째 아이템(가장위쪽)부터 차례대로 0,1,2,3.....)

//네번재 파리미터 : 클릭된 아이템의 아이디(특별한 설정이 없다면 세번째 파라이터인 position과 같은 값)

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

// TODO Auto-generated method stub

//클릭된 아이템의 위치를 이용하여 데이터인 문자열을 Toast로 출력

Toast.makeText(MainActivity.this, mDatas.get(position), Toast.LENGTH_SHORT).show();

}

};

}




반응형

+ Recent posts