본문 바로가기

프로그래밍/안드로이드[Android]

안드로이드 리스트뷰(ListView) 각각의 클릭 이벤트 설정



자 오늘은 저번에 했던 리스트 뷰(ListView)에서 각각의 클릭 이벤트를 설정 하는 방법에 대해 알아보겠습니다.

 

오늘의 목표로는 해당 영역에 클릭 이벤트를 달아서 각 리스트에 해당하는 정보를 전달하도록 하는 방법을 알려드리겠습니다.

 

우선 이전 글을 참고하시면 어댑터를 이용한 리스트 뷰 구현 방법이 있습니다.

 

 

[안드로이드] 리스트 뷰(ListView) 기본 사용 예제 - 어댑터 이용

자 이번에는 엔디안 방식에 대해 간단히 정리해보는 글을 작성해 보았습니다. 오늘은 안드로이드에서 리스트 뷰(ListView)를 만드는 방법을 알아보도록 하겠습니다. ​ 이번 글에서는 간단하게 리스트를 어댑터(Ad..

baessi.tistory.com

  xml 설정

해당 xml에서 클릭 이벤트를 지정할 곳에 id 를 설정합니다.

 

저 같은 경우는 LinearLayout 자체에 클릭 이벤트를 달기 위해 해당 레이아웃에 id 설정을 "cmdArea"로 했습니다.

 

<LinearLayout
    android:id="@+id/cmdArea"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.5"
    android:background="@drawable/corner_shape">
...

 

 

  이벤트 관련 소스 코드 추가

그리고 이벤트 구현은 이전 글을 보시면 ListViewAdapter에 구현을 하였습니다.

 

우선 ListViewAdapter에 이벤트를 위해 다음과 같은 코드를 추가합니다.

LinearLayout cmdArea= (LinearLayout)convertView.findViewById(R.id.cmdArea);
cmdArea.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v){
        //해당 리스트 클릭시 이벤트
        Toast.makeText(v.getContext(), listViewItemList.get(pos).getContent(), Toast.LENGTH_SHORT).show();
    }
});

 

listViewItemList.get(pos).getContent();

 

이 부분을 보시면 클릭시 해당 리스트위 위치의 내용을 가져와 Toast 메세지로 표시를 합니다.

 

아래는 전체 소스입니다.

ListViewAdapter

public class ListViewAdapter extends BaseAdapter {


    private ImageView iconImageView;
    private TextView titleTextView;
    private TextView contentTextView;

    // Adapter에 추가된 데이터를 저장하기 위한 ArrayList
    private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();

    // ListViewAdapter의 생성자
    public ListViewAdapter() {

    }

    // Adapter에 사용되는 데이터의 개수를 리턴
    @Override
    public int getCount() {
        return listViewItemList.size();
    }

    // position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        final Context context = parent.getContext();

        // "listview_item" Layout을 inflate하여 convertView 참조 획득.
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.listview_item, parent, false);
        }

        // 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
        titleTextView = (TextView) convertView.findViewById(R.id.title);
        iconImageView = (ImageView) convertView.findViewById(R.id.icon);
        contentTextView = (TextView) convertView.findViewById(R.id.content);

        ListViewItem listViewItem = listViewItemList.get(position);

        // 아이템 내 각 위젯에 데이터 반영
        titleTextView.setText(listViewItem.getTitle());
        iconImageView.setImageResource(listViewItem.getIcon());
        contentTextView.setText(listViewItem.getContent());



        LinearLayout cmdArea= (LinearLayout)convertView.findViewById(R.id.cmdArea);
        cmdArea.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v){
                //해당 리스트 클릭시 이벤트
                Toast.makeText(v.getContext(), listViewItemList.get(pos).getContent(), Toast.LENGTH_SHORT).show();
            }
        });

        return convertView;
    }

    // 지정한 위치(position)에 있는 데이터와 관계된 아이템(row)의 ID를 리턴
    @Override
    public long getItemId(int position) {
        return position;
    }

    // 지정한 위치(position)에 있는 데이터 리턴
    @Override
    public Object getItem(int position) {
        return listViewItemList.get(position);
    }

    // 아이템 데이터 추가를 위한 함수.
    public void addItem(String title, int icon, String content) {
        ListViewItem item = new ListViewItem();

        item.setTitle(title);
        item.setIcon(icon);
        item.setContent(content);

        listViewItemList.add(item);
    }
}

 

  동작 확인

이벤트가 정상적으로 동작하는지 확인 해봅니다.

해당 영역 클릭시 리스트의 content 내용이 정상적으로 나옵니다.

 

마찬가지로 아래의 리스트들을 클릭 해보면 해당 리스트의 내용 값이 Toast 메세지로 표시되는것을 확인할 수 있습니다.

 

이상입니다 감사합니다.