마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 전화아이콘 클릭시 전화 걸기

0 추천

아래 getView의 코드 입니다. 

현재 사진 이름 번호 아이콘1 아이콘2  <<의 형태로 커스텀리스트뷰를 만든다음 

아이콘 1을 누르면 전화걸기 아이콘 2누르면 메일이 작성되게 하려고 하는데

현재 테스트 하기 위해 Toast로 메시지를 띄우게 만들어놓고 테스트를 하고 있습니다.

다만 아래와 같이 코드를 짜면 아이콘을 클릭해도 아이콘이 클릭 되지 않아 Toast로 작성해 놓은 몇번째 클전화 클릭이라는 메시지가 출력이 되지 않습니다... 어찌 해결을 하면 좋을까요..?

코드는 아래와 같이 작성한 상태이고 아이콘들은 ImagView로 만들었습니다.

public class MainActivity extends AppCompatActivity {

    class SingerAdapter extends BaseAdapter {
        ArrayList<SingerItem> items = new ArrayList<SingerItem>();
        private View.OnClickListener mListener;
        public SingerAdapter( View.OnClickListener listener ) {
            super();
            mListener = listener;
        }
        @Override
        public int getCount() {
            return items.size();
        }

        public void addItem(SingerItem item) {
            items.add(item);
        }

        @Override
        public Object getItem(int position) {
            return items.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup viewGroup) {
            final int pos = position;
            final Context context = viewGroup.getContext();

            if(convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.singer_item, viewGroup, false);
            }

            SingerItemView view = new SingerItemView(getApplicationContext());
            SingerItem item = items.get(position);
            view.setName(item.getName());
            view.setMobile(item.getMobile());
            view.setImage(item.getResId());
            view.setImageCall(item.getimageCall());
            view.setImageEmail(item.getimgageMail());


            ImageView ImageCall = (ImageView) convertView.findViewById(R.id.imageCall);

            ImageCall.setOnClickListener(mListener);


            return view;
        }
    }

    EditText editText;

    ListView listView;
    SingerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        adapter = new SingerAdapter();
        adapter.addItem(new SingerItem("가", "010-1000-1000", "aaaa@aaaa.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("나", "010-2000-2000", "bbbb@bbbb.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("다", "010-3000-3000", "cccc@cccc.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("라", "010-4000-4000", "dddd@dddd.com", R.drawable.singer, R.drawable.call, R.drawable.email));

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                SingerItem item = (SingerItem) adapter.getItem(position);
                Toast.makeText(getApplicationContext(), "선택: " + item.getName(), Toast.LENGTH_SHORT).show();
            }

        });
    }
}
답답 님이 2017년 7월 5일 질문
2017년 7월 5일 수정

1개의 답변

0 추천
 
채택된 답변
익명사용자 님이 2017년 7월 5일 답변
아이콘들이 ImageView로 되어있는데 역시 마찬가지 인가요?
네... ImageButton 자체가 아래와 같이 ImageView를 상속해서 만든 위젯입니다.

public class ImageButton extends ImageView
내용 수정했는데 코드부분 다시 한번 봐주실수 있으신가요?
위의 수정한 코드 처럼 되어있을때

1. listview에 있는 버튼이벤트를 받기 위해서는 버튼에 아래 속성을 추가해야한다.

   <Button

      android:focusable="false"

      />



2. listview에 있는 버튼 이벤트를 받기 위해서는

   1) Activity에서 Adapter를 사용할때 clickevent를 전달한다.



    private MessageAdap mMessageAdapter = null;

    mMessageAdapter = new MessageAdap(this, mOnClickListener);



    View.OnClickListener mOnClickListener = new View.OnClickListener() {

        @Override

        public void onClick(View v) {

        }

    };

같은 경우는 어디에다가 써줘야 맞는건지 잘 모르겠습니다..
생성자가 없는데.. 생성자를 만들어서 이벤트 리스너를 넘겨주시면 됩니다.
public class MainActivity extends AppCompatActivity {
 
        class SingerAdapter extends BaseAdapter {
        ArrayList<SingerItem> items = new ArrayList<SingerItem>();
     private View.OnClickListener mListener;
    public SingerAdapter( View.OnClickListener listener ) {
            super();
             mListener = listener;
    }
        @Override
        public int getCount() {
            return items.size();
        }
 
        public void addItem(SingerItem item) {
            items.add(item);
        }
 
        @Override
        public Object getItem(int position) {
            return items.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(final int position, View convertView, ViewGroup viewGroup) {
            final int pos = position;
            final Context context = viewGroup.getContext();
 
            if(convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.singer_item, viewGroup, false);
            }
 
            SingerItemView view = new SingerItemView(getApplicationContext());
            SingerItem item = items.get(position);
            view.setName(item.getName());
            view.setMobile(item.getMobile());
            view.setImage(item.getResId());
            view.setImageCall(item.getimageCall());
            view.setImageEmail(item.getimgageMail());
 
 
            ImageView ImageCall = (ImageView) convertView.findViewById(R.id.imageCall);
 
            ImageCall.setOnClickListener(mListener);
 
 
            return view;
        }
    }
}
뭐 굳이  생성자가 아니라. 별도 setter를 통해 넘겨 주실수도 있긴 합니다.ㅎㅎ
public void setLisener(View.OnClickListener listener ) {
  mListener= listener;
}
내용수정 한번 더 했습니다 메인엑티비티 전체 코드 인데요 죄송하지만..ㅜ
한번 전체 리뷰 부탁드립니다.. 알려주신대로 코드를 작성하면 onCreate안에 있는 adapter = new SingerAdapter(); 부분에 오류가 나 전체 리뷰 한번 부탁 드립니다...ㅜ
생성자에 파라메터로 이벤트 리스너를 받도록 바꿨으니,..
adapter = new SingerAdapter(mOnClickListener);  와 같이
앞서 생성한 리스너를 넘겨주셔야 합니다.
더 질문하시면 짜달라는 말 밖에 안되요.. 그래도 모르겠으면, java 부터 공부 하셔야 할 듯 합니다.
흠.. 제가 어제부터 하루종일 해봤는데 리스너를 넘겨줘야한다는걸 잘 모르겠습니다..ㅜㅜ
알려주실 수 없을까요?
public class MainActivity extends AppCompatActivity {
 
    class SingerAdapter extends BaseAdapter {
        ArrayList<SingerItem> items = new ArrayList<SingerItem>();
        private View.OnClickListener mListener;
        public SingerAdapter( View.OnClickListener listener ) {
            super();
            mListener = listener;
        }
        @Override
        public int getCount() {
            return items.size();
        }
 
        public void addItem(SingerItem item) {
            items.add(item);
        }
 
        @Override
        public Object getItem(int position) {
            return items.get(position);
        }
 
        @Override
        public long getItemId(int position) {
            return position;
        }
 
        @Override
        public View getView(final int position, View convertView, ViewGroup viewGroup) {
            final int pos = position;
            final Context context = viewGroup.getContext();
 
            if(convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.singer_item, viewGroup, false);
            }
 
            SingerItemView view = new SingerItemView(getApplicationContext());
            SingerItem item = items.get(position);
            view.setName(item.getName());
            view.setMobile(item.getMobile());
            view.setImage(item.getResId());
            view.setImageCall(item.getimageCall());
            view.setImageEmail(item.getimgageMail());
 
 
            ImageView ImageCall = (ImageView) convertView.findViewById(R.id.imageCall);
 
            ImageCall.setOnClickListener(mListener);
 
 
            return view;
        }
    }
 
    EditText editText;
 
    ListView listView;
    SingerAdapter adapter;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        listView = (ListView) findViewById(R.id.listView);
 
        adapter = new SingerAdapter(mOnClickListener); // mOnClickListener 를 생성자에 넣어주는 부분입니다.
        adapter.addItem(new SingerItem("가", "010-1000-1000", "aaaa@aaaa.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("나", "010-2000-2000", "bbbb@bbbb.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("다", "010-3000-3000", "cccc@cccc.com", R.drawable.singer, R.drawable.call, R.drawable.email));
        adapter.addItem(new SingerItem("라", "010-4000-4000", "dddd@dddd.com", R.drawable.singer, R.drawable.call, R.drawable.email));
 
        listView.setAdapter(adapter);
 
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                SingerItem item = (SingerItem) adapter.getItem(position);
                Toast.makeText(getApplicationContext(), "선택: " + item.getName(), Toast.LENGTH_SHORT).show();
            }
 
        });
    }

   // 이벤트 리스너 입니다. 예제 코드와 동일하게 선언 했어요
   View.OnClickListener mOnClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // 전화 거는 코드 넣어주세요.
    }
   };
}
정말 감사합니다!!
이미지뷰가 2개라서(전화아이콘,메일아이콘)
전화거는 코드 부분에 switch case 문으로 ID 받아서 사용해야 하는건가요?
ImageView ImageCall = (ImageView) convertView.findViewById(R.id.imageCall);
 ImageCall.setOnClickListener(mListener);
로 이미지 리소스에만 이벤트 리스너를 등록 했기 때문에..  메일 아이콘은 눌러도 이벤트 안들어올 겁니다.

만약, 둘다 이벤트를 받으려면 비슷한 방법으로 메일 용 이벤트 리스너를 한개 더 넣어주던지, 이벤트 리스너에서 getTag, setTag를 써서 구분 해서 사용하셔야 할 듯 합니다.
현재 전화아이콘을 눌러도 이벤트가 안받아지는건지 눌리지가 않더라구요..
전화거는 코드 넣어주세요 기입한곳에 Toast로 메시지 출력을 하게 해봤는데..

아이콘이 클릭되지 않고 리스트뷰가 클릭 되더라구요 혹시 이건 왜그런지 아시나요?

그리고 정말 많은 도움 정말정말 감사합니다..
...