Fragment 안에서 리스트뷰의 각 목록이 각각 다른 곳으로 클릭되게 하려면 어떻게해야할까요? (초보ㅠㅠ, 코딩있습니다)
조회수 2757회
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를 사용하시는걸 권장 드립니다.
비슷하지만 사용하기 더 쉽기도 하구요.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 리스트뷰 항목 각각 다르게 클릭 처리를 하고 싶은데.. 알 수 없는 사용자 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 예제를 링크 걸겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 답변감사드립니다..(꾸벅) 그런데 제가 구현하고싶은것은 지금 이 fragment에서 그대로 다른 fragment를 연결해서 어떤 Children 목록 중 하나를 클릭 시 다른 fragment를 보여주는 것이에요. 제가 지금 한 fragment에 웹뷰를 구현시켜놓았는데(게시판), 그런데 Children 배열에 ㄱ을 클릭하면 그 게시판의 어떤 글 중 하나로 넘어가게 하고, ㄴ을 클릭하면 그 게시판의 어떤 글 중 다른 하나로 넘어가게 하는 것을 구현하고싶어서요. 혹시 이런것도 가능한가요? 알 수 없는 사용자 2016.5.20 14:57
- 질문하신걸 구현할려면 onClick 누르면 Fragment -> Activity가 받아서 말씀하신 행동을 처리하시면 됩니다. Fragment 교체하는게 가능합니다. ... 해당 부분은 구글에서 검색해보시면 나오구요....;; 책을 하나 사셔서 공부하시는것도 추천드립니다. 알 수 없는 사용자 2016.5.20 15:01
-
댓글 입력