API를 사용하여 Android 앱에 설문지를 작성하고 있습니다. API를 기반으로 확장 가능한 목록보기를 사용하고 있는데 질문 카테고리 (상위) 및 질문 (하위)이 표시됩니다. 질문 (어린이)은 질문 유형에 따라 변경 될 수 있습니다 (목표 유형 : 라디오 버튼, 예 또는 아니오, 텍스트 유형 : 텍스트 편집).Android 확장형 목록보기 라디오 버튼
나는 사용자 정의 레이아웃 XML을 정적으로 생성하고 getChildView 메소드 또는 확장 가능한 listview에서 해당 레이아웃을 확장합니다.
확장 가능한 목록보기를 확장/축소하면 모든 라디오 버튼 선택이 잘못됩니다. 예 : 첫 번째 카테고리 하위 항목에 대해 대답하면 일부 다른 카테고리에 대해서도 답변됩니다.
제게이 문제에 대한 해결책을 제공해주십시오. 라디오 버튼/라디오 그룹을 동적으로 생성해야합니까 아니면 충분합니다. questionType에 따라 위젯을 숨기거나 표시합니다. 아래 코드를 찾으십시오.
내 HashMap의 값이 같은 수 있습니다 :
HashMap<String, ArrayList<QListModel>> expandableListDetail = new HashMap<>();
ArrayList를 함유하고 있음 : 질문, QuestionType을 QuestionId 등 여기
내 코드는 다음과 같습니다 내 어댑터 클래스import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> expandableListTitle;
private HashMap<String, ArrayList<QListModel>> expandableListDetail;
public ExpandableListAdapter(Context context, List<String> expandableListTitle, HashMap<String,
ArrayList<QListModel>> expandableListDetail) {
this.context = context;
this.expandableListTitle = expandableListTitle;
this.expandableListDetail = expandableListDetail;
}
@Override
public int getGroupCount() {
return this.expandableListTitle.size();
}
@Override
public int getChildrenCount(int listPosition) {
// return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
// .size();
Log.e("VCVCV",String.valueOf(this.expandableListDetail.get(this.expandableListTitle.get(listPosition)).size()));
return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
.size();
}
@Override
public Object getGroup(int listPosition) {
return this.expandableListTitle.get(listPosition);
}
@Override
public Object getChild(int listPosition, int expandedListPosition) {
return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
.get(expandedListPosition);
}
@Override
public long getGroupId(int listPosition) {
return listPosition;
}
@Override
public long getChildId(int listPosition, int expandedListPosition) {
return expandedListPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int listPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
String listTitle = (String) getGroup(listPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this.context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.expand_parent, null);
}
TextView listTitleTextView = (TextView) convertView
.findViewById(R.id.groupText);
listTitleTextView.setText(listTitle);
return convertView;
}
@Override
public View getChildView(int listPosition, final int expandedListPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
QListModel expandedListText = (QListModel) getChild(listPosition, expandedListPosition);
Log.e("ChildQuestions",expandedListText.getqList());
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.expand_child_selection, null);
}
TextView expandedListTextView = (TextView) convertView.findViewById(R.id.childText);
EditText expandedListEditText = (EditText) convertView.findViewById(R.id.editTextAdditional);
expandedListTextView.setText(expandedListText.getqList());
RadioGroup rgp = (RadioGroup) convertView.findViewById(R.id.radioGroup);
//NotUsing
RadioButton radioYes=(RadioButton) convertView.findViewById(R.id.radioYes);
RadioButton radioNo=(RadioButton) convertView.findViewById(R.id.radioNo);
if (expandedListText.getqType().equals("Y/N")){
rgp.setVisibility(View.VISIBLE);
expandedListEditText.setVisibility(View.GONE);
}
else {
expandedListEditText.setVisibility(View.VISIBLE);
rgp.setVisibility(View.GONE);
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
내 레이아웃
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingLeft="20dp"
android:layout_marginRight="20dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/childText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textColor="@color/colorBlackLight"
android:text=""/>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioYes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorBlackLight"
android:text="Yes"/>
<RadioButton
android:id="@+id/radioNo"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorBlackLight"
android:text="No"/>
</RadioGroup>
<EditText
android:id="@+id/editTextAdditional"
android:layout_width="match_parent"
android:padding="5dp"
android:textColor="@color/colorBlackLight"
android:layout_marginBottom="10dp"
android:layout_marginRight="20dp"
android:background="@color/colorFrameBLueLight"
android:textSize="12sp"
android:layout_height="wrap_content" />
</LinearLayout>
문제점 : 모든 범주의 첫 번째 범주에서 항목을 선택하면 항목을 선택하면 라디오 단추와 라디오 그룹을 동적으로 관리해야합니까? 그렇다면 어떤 방법으로해야합니까. getChildView에서 생성하면 범주를 확장 할 때마다 호출됩니다. 따라서 이전 선택은 기억되지 않습니다. 제게 해결책을주십시오. 미리 감사드립니다.
사용 viewholder 또는 recyclerview 아래의 사용자 선택을 추적하기 위해 sparseintarray를 사용하여 검색됩니다 발생 ,보기가 재사용되므로 동일한 객체가 검색되므로 사용자 선택을 추적하기 위해 스파 스틴 어레이를 사용하십시오. –