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

프래그먼트에서 연결된 어댑터의 뷰 요소에 클릭이벤트 거는법 질문입니다

0 추천

액티비티에 연결된 프래그먼트가 있고, 이 프래그먼트에 연결된 어댑터가 있고요,

어댑터에는 레이아웃인플래터로 연결된 레이아웃이 있습니다.

 

여기서 어댑터에 연결된 레이아웃에 있는 TextView를 온클릭 버튼으로 활용하고자 하는데

프래그먼트에서 저 TextView에 클릭이벤트 거는법이 잘 안되네요,

프래그먼트에서 따로 레이아웃인플래터로 걸고 온클릭리스너 걸어봐도

아예 인식을 못합니다, Log 걸어봐도 아무것도 안찍히네요

 

혹은 어댑터에서 클릭이벤트를 걸고 저 프래그먼트 안에 있는 함수를 실행해줄수 있으면 되는데

함수에 static을 걸수가 없어서 이런경우는 또 어떻게 불러와야 할지...

 

어댑터에서도 TextView요소를 잡아놓고 클릭이벤트가 있어서 프래그먼트에서 동시에 적용이 안되는걸까요?

부디 조언 부탁드립니다.

 

// 어댑터 소스

public class FriendsAdapter extends RecyclerView.Adapter<FriendsAdapter.MyViewHolder> {
    //private Context mContext;
    private Activity activity;
    private ArrayList<Friend> mFriendList;
    private FriendsAdapter.RecyclerItemClickListener listener;
    private FriendsAdapter.RecyclerItemLongClickListener listener2;
    private int selectedPosition;

    public FriendsAdapter(FragmentActivity activity, ArrayList<Friend> mFriendList, RecyclerItemClickListener recyclerItemClickListener, RecyclerItemLongClickListener recyclerItemLongClickListener) {
        this.activity = activity;
        this.mFriendList = mFriendList;
        this.listener = recyclerItemClickListener;
        this.listener2 = recyclerItemLongClickListener;
    }

    @Override
    public FriendsAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.friends_row, parent, false);
        return new FriendsAdapter.MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView red, grey;             //롱클릭에 대한 콘텍스트 메뉴

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public MyViewHolder(View itemView) {
            super(itemView);
            red = (TextView)itemView.findViewById(R.id.red);
            grey = (TextView)itemView.findViewById(R.id.grey);
        }

        public void bind(final Friend friends, final FriendsAdapter.RecyclerItemClickListener listener) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
					listener.onClickListener(friends, getLayoutPosition());
                }
            });

        }

        public void bind2(final Friend friends, final FriendsAdapter.RecyclerItemLongClickListener listener2) {
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
					// 롱클릭시 red와 grey 텍스트뷰 나타나게 하기
                    red.setVisibility(View.VISIBLE);
                    grey.setVisibility(View.VISIBLE);

                    red.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
							//여기는 클릭이 잡힙니다
                        }
                    });
                    return true; //롱클릭 후 클릭이벤트 중복방지 위한 true
                }
            });
        }
    }

    public interface RecyclerItemClickListener {//RecyclerItemClickListener 1

        void onClickListener(Friend friends, int position);
    }

    public interface RecyclerItemLongClickListener {
        void onLongClickListener(Friend friends, int position);
    }

    public void setSelectedPosition(int currentIndex) {//setSelectedPosition 2
        this.selectedPosition = currentIndex;
    }

    public int getSelectedPosition() {//setSelectedPosition 6 다시changeSelectedPlace로
        return selectedPosition;
    }
}

 

// 프래그먼트 소스

public class FriendFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

    private RecyclerView recycler;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.friend, container, false);

        // Setting object
        recycler = (RecyclerView) view.findViewById(R.id.recyclerview_fr);

        // List initialize
        dividerItemDecoration = new DividerItemDecoration(recycler.getContext(), new LinearLayoutManager(getActivity()).getOrientation());
        dividerItemDecoration.setDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.lin_gray));
        recycler.addItemDecoration(dividerItemDecoration);
        mFriendList = new ArrayList<>();

        recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
        
		mAdapter = new FriendsAdapter(getActivity(), mFriendList, new FriendsAdapter.RecyclerItemClickListener() {
            @Override
            public void onClickListener(Friend friends, int position) {
                // 리스트 영역 클릭시 이벤트 실행
                Intent intentfr = new Intent(getContext(), FriendProfile.class);
                intentfr.putExtra("id", friends.getFr_id());
                startActivity(intentfr);
            }
        }, new FriendsAdapter.RecyclerItemLongClickListener() {
            @Override
            public void onLongClickListener(final Friend friend, final int position) {
                final boolean pushCurrentlyEnabled = friend.isTouch();
                String[] choose;
                //롱클릭시 어댑터와 연결된 레이아웃 인플래터로 불러와서
                choose = new String[]{getString(R.string.mygpsblock), getString(R.string.frienddel)};
                LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                View dialogView = layoutInflater.inflate(R.layout.friends_row, null);
				//red와 grey 잡아주고
                final TextView red = (TextView)dialogView.findViewById(R.id.red);
                final TextView grey = (TextView)dialogView.findViewById(R.id.grey);
				
				//클릭이벤트 연결
                grey.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
						//여기 클릭이벤트로 들어오질 못합니다
                        red.setVisibility(View.GONE);
                        grey.setVisibility(View.GONE);
                    }
                });

                red.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
						//여기 클릭이벤트로 들어오질 못합니다
                    }
                });
            }
        });
        recycler.setAdapter(mAdapter);
        return view;
    }

    @Override
    public void onRefresh() {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

 

파르네제 (2,030 포인트) 님이 2018년 3월 19일 질문
파르네제님이 2018년 3월 19일 수정

1개의 답변

+1 추천
 
채택된 답변

TextView

clickable='true' 쓰세욤

설춘식 (5,250 포인트) 님이 2018년 3월 19일 답변
파르네제님이 2018년 3월 19일 채택됨
네, XML쪽에 텍스트뷰 요소에
android:clickable="true"
되어 있습니다
--이 아래 코드 물어보신거죠?
  new FriendsAdapter.RecyclerItemLongClickListener() {
            @Override
            public void onLongClickListener(Friend friends, int position) {
                String[] choose;
                //롱클릭시 어댑터와 연결된 레이아웃 인플래터로 불러와서
                LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                //red와 grey 잡아주고
                final TextView red = (TextView)dialogView.findViewById(R.id.red);
                final TextView grey = (TextView)dialogView.findViewById(R.id.grey);

                //클릭이벤트 연결
                grey.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //여기 클릭이벤트로 들어오질 못합니다
                        red.setVisibility(View.GONE);
                        grey.setVisibility(View.GONE);
                    }
                });

                red.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //여기 클릭이벤트로 들어오질 못합니다
                    }
                });
            }
네 맞습니다, 어댑터의 버튼이 클릭시 처리해줘야 할 함수가 프래그먼트에 있어서요
FriendsAdapter 여기만 봤네요

onLongClickListener안에서 다시 inflater를 쓰시면 안되죠 아래 코드로 테스트해보세요
새로 inflater해서 쓰면 당연하게 안되죠!!!!!!! ㅋㅋㅋ 수고하세요
---------------------------------------------------------------------------------------------
    public interface RecyclerItemLongClickListener {
        void onLongClickListener();
    }
  ->
   public interface RecyclerItemLongClickListener {
        void onLongClickListener(Friend friend,View view);
    }
---------------------------------------------------------------------------------------------

 public void bind2(final Friend friends, final FriendsAdapter.RecyclerItemLongClickListener listener2) {
            itemView.setLongClickable(true);
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    // 롱클릭시 red와 grey 텍스트뷰 나타나게 하기
                    red.setVisibility(View.VISIBLE);
                    grey.setVisibility(View.VISIBLE);

                    red.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            //여기는 클릭이 잡힙니다
                        }
                    });
                    return true; //롱클릭 후 클릭이벤트 중복방지 위한 true
                }
            });
        }

->
 public void bind2(final Friend friends, final FriendsAdapter.RecyclerItemLongClickListener listener2) {
            itemView.setLongClickable(true);
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    // 롱클릭시 red와 grey 텍스트뷰 나타나게 하기
                    red.setVisibility(View.VISIBLE);
                    grey.setVisibility(View.VISIBLE);

                    if(listener2 !=null){
                        listener2.onLongClickListener(friends,itemView);
                    }
                    return true; //롱클릭 후 클릭이벤트 중복방지 위한 true
                }
            });
        }
---------------------------------------------------------------------------------------------

 mAdapter = new FriendsAdapter(getActivity(), mFriendList, new FriendsAdapter.RecyclerItemClickListener() {
            @Override
            public void onClickListener(Friend friends, int position) {
                // 리스트 영역 클릭시 이벤트 실행
                Intent intentfr = new Intent(getContext(), FriendProfile.class);
                intentfr.putExtra("id", friends.getFr_id());
                startActivity(intentfr);
            }
        }, new FriendsAdapter.RecyclerItemLongClickListener() {
            @Override
            public void onLongClickListener(final Friend friend, final int position) {
                final boolean pushCurrentlyEnabled = friend.isTouch();
                String[] choose;
                //롱클릭시 어댑터와 연결된 레이아웃 인플래터로 불러와서
                choose = new String[]{getString(R.string.mygpsblock), getString(R.string.frienddel)};
                LayoutInflater layoutInflater = LayoutInflater.from(getContext());
                View dialogView = layoutInflater.inflate(R.layout.friends_row, null);
                //red와 grey 잡아주고
                final TextView red = (TextView)dialogView.findViewById(R.id.red);
                final TextView grey = (TextView)dialogView.findViewById(R.id.grey);
                 
                //클릭이벤트 연결
                grey.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //여기 클릭이벤트로 들어오질 못합니다
                        red.setVisibility(View.GONE);
                        grey.setVisibility(View.GONE);
                    }
                });
 
                red.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        //여기 클릭이벤트로 들어오질 못합니다
                    }
                });
            }
        });

->
 FriendsAdapter adapter = new FriendsAdapter(this, list, new FriendsAdapter.RecyclerItemClickListener() {
            @Override
            public void onClickListener(Friend friends, int position) {
            }
        }, new FriendsAdapter.RecyclerItemLongClickListener() {
            @Override
            public void onLongClickListener(Friend friend, View view) {
                final TextView red = view.findViewById(R.id.red);
                final TextView grey = view.findViewById(R.id.grey);

                red.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                    }
                });

                grey.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                    }
                });

            }

        });
어댑터쪽에서 온클릭리스너 넘길때 뷰도 던져서
프래그먼트에서 뷰까지 받아와서 처리 했습니다
막막하던 부분인데 끝까지 신경써주시고 너무 감사해요ㅠㅠ
...