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


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 안에서 작동되게 웹뷰가...) 초보입니다 도와주시면 감사드리겠습니당 ㅠ.ㅜ!!!

  • 2016년 05월 20일에 작성됨

조회수 415


2 답변


좋아요
4
싫어요
채택취소하기

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

각 그룹/서브 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


  • 리스트뷰 항목 각각 다르게 클릭 처리를 하고 싶은데..    Jaceis   2016.5.20 12:02     
  • 각각다르게 클릭되게하려면 어떤식으로 클릭처리구문을 넣어야하는건가요??    Jaceis   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 배열에 ㄱ을 클릭하면 그 게시판의 어떤 글 중 하나로 넘어가게 하고, ㄴ을 클릭하면 그 게시판의 어떤 글 중 다른 하나로 넘어가게 하는 것을 구현하고싶어서요. 혹시 이런것도 가능한가요?    Jaceis   2016.5.20 14:57     
  • 질문하신걸 구현할려면 onClick 누르면 Fragment -> Activity가 받아서 말씀하신 행동을 처리하시면 됩니다. Fragment 교체하는게 가능합니다. ... 해당 부분은 구글에서 검색해보시면 나오구요....;; 책을 하나 사셔서 공부하시는것도 추천드립니다.     Taehwan Kwon   2016.5.20 15:01     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close