Fragment 안에서 리스트뷰의 각 목록이 각각 다른 곳으로 클릭되게 하려면 어떻게해야할까요? (초보ㅠㅠ, 코딩있습니다)

조회수 2690회
public class SocialFragment extends Fragment {
    private static final String TAG = SocialFragment.class.getSimpleName();
    View rootView;
    ExpandableListView lv;
    private String[] groups;
    private String[][] children;


    public SocialFragment() {

    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        groups = new String[]{"Test1", "Test2", "Test3", "Test4"};

        children = new String[][]{
                {"a","b","c","d"},
                {"ㄱ","ㄴ","ㄷ","d","ddd","hahahaha"},
                {"ㄹ","ㅁ","ㅂ","ㅅ"},
                {"ㅇ","ㅈ","ㅊ"}
    };
        final Class<?>[] ACTIVITIES = { Empty1.class, Empty1.class, List1.class, List2.class, List3.class, List4.class, Empty1.class};
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_lineup, container, false);

        return rootView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        lv = (ExpandableListView) view.findViewById(R.id.expListView);


    }

    public class ExpandableListAdapter extends BaseExpandableListAdapter {

        private final LayoutInflater inf;
        private String[] groups;
        private String[][] children;

        public ExpandableListAdapter(String[] groups, String[][] children) {
            this.groups = groups;
            this.children = children;
        }

        @Override
        public int getGroupCount() {
            return groups.length;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return children[groupPosition].length;
        }

        @Override
        public Object getGroup(int groupPosition) {
            return groups[groupPosition];
        }

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return children[groupPosition][childPosition];
        }

        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }


        @Override
        public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

            ViewHolder holder;
            if (convertView == null) {
                convertView = inf.inflate(R.layout.list_item, parent, false);
                holder = new ViewHolder();

                holder.text = (TextView) convertView.findViewById(R.id.lblListItem);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.text.setText(getChild(groupPosition, childPosition).toString());

            return convertView;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = inf.inflate(R.layout.list_group, parent, false);

                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.lblListHeader);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.text.setText(getGroup(groupPosition).toString());

            return convertView;
        }

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }

        private class ViewHolder {
            TextView text;
        }
    }
}

이게 expandable리스트뷰를 적용시킨 java 파일입니다. 저기 children 목록에 'ㄱ' , 'ㄴ', 'ㄷ', ..........등등을 각각 클릭하면 각각 다르게 url 링크를 걸고 싶습니다. 어떻게 해야하나요? 예를들면 리스트목록 중 ㄱ을 클릭했을 때 www.naver. , ㄴ을 클릭했을 때 google 이런식으로요... (새창뜨는 것 말고 그냥 fragment 안에서 작동되게 웹뷰가...) 초보입니다 도와주시면 감사드리겠습니당 ㅠ.ㅜ!!!

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 다음과 같이 작성하시면 됩니다.

    각 그룹/서브 View의 아이템을 눌리게 하고 싶으시면...

    @Override
            public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    
                // ... 생략
    
                holder.text.setText(getChild(groupPosition, childPosition).toString());
                holder.text.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        /// Click 처리
                    }
                };
    
                // ... 생략
                return convertView;
            }
    
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                // ... 생략
    
                holder.text.setText(getGroup(groupPosition).toString());
                holder.text.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        /// Click 처리
                    }
                };
    
                return convertView;
            }
    

    위와 같이 TextView에 OnClickListener를 처리하시면 됩니다.

    그리고 ListView보다는 RecyclerView를 사용하시는걸 권장 드립니다.

    비슷하지만 사용하기 더 쉽기도 하구요.

    RecyclerView

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 리스트뷰 항목 각각 다르게 클릭 처리를 하고 싶은데.. 알 수 없는 사용자 2016.5.20 12:02
    • 각각다르게 클릭되게하려면 어떤식으로 클릭처리구문을 넣어야하는건가요?? 알 수 없는 사용자 2016.5.20 13:17
  • 추가로 샘플 코드를 드릴게요

    우선 데이터를 다음과 같이 처리해주시면 됩니다.

    ArrayList<데이터 객체이름> itemList;
    
    별도 클래스로 다음과 같은 형태로 작성하시구요.
    public class 데이터 객체 이름 {
        public String url;
    }
    

    위와 같이 작성해주시구요.

    Intent를 통해서 웹 브라우저를 호출하게 되는 코드는 다음과 같습니다.

    Uri uri = Uri.parse("http://www.google.com");
    Intent intent  = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
    

    그리고 이를 합치면 다음과 같이 처리할 수 있습니다.

    itemList로 작업하면 사용하기 간단해서 다음과 같이 하였고, get을 통해 특정 위치의 값을 불러올 수 있습니다.

    groupPostion, childPosition을 통해 아이템에 맞는 행동을 처리하게 하시면 됩니다.

    이 경우 itemList가 2개여야겠죠?

    @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                    // ... 생략
        holder.text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                   String url = itemList.get(groupPosition).url;
                   Uri uri  = Uri.parse(url);
                   Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                  context.startActivity(intent);
            }
        };
    }
    

    위와 같이 예제로 작성할 수 있습니다.

    context와 ItemList는 외부에서 셋팅을 해주셔야 합니다.

    제가 과거에 작성했던 ExpandableListView 예제를 링크 걸겠습니다.

    ExpandableListView

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변감사드립니다..(꾸벅) 그런데 제가 구현하고싶은것은 지금 이 fragment에서 그대로 다른 fragment를 연결해서 어떤 Children 목록 중 하나를 클릭 시 다른 fragment를 보여주는 것이에요. 제가 지금 한 fragment에 웹뷰를 구현시켜놓았는데(게시판), 그런데 Children 배열에 ㄱ을 클릭하면 그 게시판의 어떤 글 중 하나로 넘어가게 하고, ㄴ을 클릭하면 그 게시판의 어떤 글 중 다른 하나로 넘어가게 하는 것을 구현하고싶어서요. 혹시 이런것도 가능한가요? 알 수 없는 사용자 2016.5.20 14:57
    • 질문하신걸 구현할려면 onClick 누르면 Fragment -> Activity가 받아서 말씀하신 행동을 처리하시면 됩니다. Fragment 교체하는게 가능합니다. ... 해당 부분은 구글에서 검색해보시면 나오구요....;; 책을 하나 사셔서 공부하시는것도 추천드립니다. 알 수 없는 사용자 2016.5.20 15:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)