0

나는 사용자 정의ArrayAdapter으로 작성했습니다. ListView 각 항목 내용은 TextViewRadioGroup (4 RadioButton)입니다. 각 목록 항목에 대해 RadioButton 중 하나를 선택할 수 있습니다. 하단 ListView 버튼이있는 바닥 글이 있습니다. 내가 원하는 것은 내가 같이 버튼을 클릭 할 때 모든 데이터를 얻을 수 있습니다 :ListView 안의 Radiobuttons에서 태그 가져 오기

이름 1 - 1

NAME2 - 3

NAME3 - 2

NAME4 - 3

..

첫 번째 열 - 텍스트 TextView

둘째 열 - 볼 수있는 선택 의 RadioButton

Atcivity의 태그 :

public class MarksAdd extends ListActivity { 
    ArrayList<String> itemlist = new ArrayList<String>(); 
    private Context context = null; 
    private ListView listView; 
    private Button BtnDone; 
    @Override 
    public void onCreate(Bundle saveInstanceState) { 
     super.onCreate(saveInstanceState); 
     setContentView(R.layout.marks_add); 


     Intent intent = getIntent(); 
     int day = intent.getIntExtra("day", 0); 
     int month = intent.getIntExtra("month", 0); 
     int year = intent.getIntExtra("year", 0); 


     String dayStr = String.valueOf(day); 
     String monthStr = String.valueOf(month); 
     String yearStr = String.valueOf(year); 


     if (day != 0) { 
      if(dayStr.length()==1){ 
       dayStr = "0"+dayStr; 
      } 
      if(monthStr.length()==1){ 
       monthStr = "0"+monthStr; 
      } 
      yearStr = yearStr.substring(2); 
      String date = dayStr+"."+monthStr+"."+yearStr; 
      Toast.makeText(this, date, Toast.LENGTH_SHORT).show(); 
     } 


     final ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this, 
       getModel()); 





     listView = getListView(); 
     LayoutInflater inflater = getLayoutInflater(); 
     listView.addFooterView(inflater.inflate(R.layout.list_footer, null), null, false); 

     setListAdapter(adapter); 

     BtnDone = (Button) findViewById(R.id.markListBtn); 
     BtnDone.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       //get Values ????? 

      } 



     }); 


    } 

    private List<Model> getModel() { 

     List<Model> list = new ArrayList<Model>(); 

     dbHelper sql = new dbHelper(this); 
     SQLiteDatabase db = sql.getWritableDatabase(); 
     Cursor cursor = db.query(
       PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("group", ""), new String[]{ 
         "Id", "Name"}, 
       null, // The columns for the WHERE clause 
       null, // The values for the WHERE clause 
       null, // don't group the rows 
       null, // don't filter by row groups 
       "Name ASC" // The sort order 
     ); 

     while (cursor.moveToNext()) { 
      // GET COLUMN INDICES + VALUES OF THOSE COLUMNS 
      int id = cursor.getInt(cursor.getColumnIndex("Id")); 
      String name = cursor.getString(cursor 
        .getColumnIndex("Name")); 
      list.add(get(name)); 

     } 
     cursor.close(); 





     // Initially select one of the items 


     return list; 
    } 

    private Model get(String question) { 
     return new Model(question); 
    } 



} 

ArrayAdapter와 :

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 
    private final List<Model> list; 
    private final Activity context; 

    public InteractiveArrayAdapter(Activity context, List<Model> list) { 
     super(context, R.layout.simple_list_item1_marks, list); 
     this.context = context; 
     this.list = list; 
    } 

    class ViewHolder { 
     TextView t = null; 
     RadioGroup group; 

     ViewHolder(View v) { 
      t = (TextView) v.findViewById(R.id.personName); 
      group = (RadioGroup) v.findViewById(R.id.myRgroup); 
     } 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder = null; 

     if (v == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      v = inflater.inflate(R.layout.simple_list_item1_marks, parent, false); 
      holder = new ViewHolder(v); 
      v.setTag(holder); 
      final View finalV = v; 
      holder.group 
        .setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 

         public void onCheckedChanged(RadioGroup group, 
                int checkedId) { 
          Integer pos = (Integer) group.getTag(); // To identify the Model object i get from the RadioGroup with getTag() 
          // an integer representing the actual position 
          Model element = list.get(pos); 
          switch (checkedId) { //set the Model to hold the answer the user picked 
           case R.id.rb1: 
            element.current = Model.ANSWER_ONE_SELECTED; 
            break; 
           case R.id.rb2: 
            element.current = Model.ANSWER_TWO_SELECTED; 
            break; 
           case R.id.rb3: 
            element.current = Model.ANSWER_THREE_SELECTED; 
            break; 
           case R.id.rb4: 
            element.current = Model.ANSWER_FOUR_SELECTED; 
            break; 
           default: 
            element.current = Model.NONE; // Something was wrong set to the default 
          } 

         } 
        }); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 
     holder.group.setTag(position); // I passed the current position as a tag 

     holder.t.setText(list.get(position).question); // Set the question body 

     if (list.get(position).current != Model.NONE) { 
      RadioButton r = (RadioButton) holder.group.getChildAt(list 
        .get(position).current); 
      r.setChecked(true); 
     } else { 
      holder.group.clearCheck(); // This is required because although the Model could have the current 
      // position to NONE you could be dealing with a previous row where 
      // the user already picked an answer. 

     } 
     return v; 
    } 
} 

모델 :

public class Model { 
    String question; // hold the question 
    int current = NONE; // hold the answer picked by the user, initial is NONE(see below) 
    public static final int NONE = 1000; // No answer selected 
    public static final int ANSWER_ONE_SELECTED = 0; // first answer selected 
    public static final int ANSWER_TWO_SELECTED = 1; // second answer selected 
    public static final int ANSWER_THREE_SELECTED = 2; // third answer selected 
    public static final int ANSWER_FOUR_SELECTED = 3; // forth answer selected 

    public Model(String question) { 
     this.question = question; 
    } 
} 

내가이 accordin을하고 있었다 g에서 that tutorial으로 변경되었습니다. 나는 진짜로 초보자입니다. 그래서 당신을 도와달라고 부탁합니다. 미안 나의 질문이 정확하지 않으면, 나의 영어는 정말로 좋지 않다.

여기에서 어떤 도움을 주셔서 감사합니다.

+0

데이터를 말하면 날짜를 의미합니까? 데이터로 무엇을하고 싶습니까? –

+0

@BasselSerio 아니요, 데이터를 의미합니다. textView 및 radioGroup의 값입니다. 나중에 데이터베이스에 저장하고 싶습니다. – Pawt3t

답변

0

첫 번째 생각은 ListView을 반복하고 각 행에서 확인 된 버튼을 얻는 것입니다. ListView는 항상 모든 자식을 포함하지 않기 때문에 실제로는 작동하지 않습니다.

대신 사용자가 실제로 선택하면 체크 된 항목을 저장해야합니다. 그런 다음 버튼을 누르면 이미 모든 데이터가 저장되어 있으므로 ListView을 반복 할 필요가 없습니다. 또한 이전 항목에 대한 현재 선택된 라디오 단추를 getView()에 설정할 수 있기 때문에 목록을 위로 스크롤하면 현재 선택 내용을이 방법으로 저장하는 것이 유용합니다.

은의이 행의 레이아웃이 전부이있다 가정 해 봅시다 :에서

<RadioGroup android:id="@+id/radio_group" ... > 
    <RadioButton android:id="@+id/radio_button_1" ... /> 
    <RadioButton android:id="@+id/radio_button_2" ... /> 
    <RadioButton android:id="@+id/radio_button_3" ... /> 
    <RadioButton android:id="@+id/radio_button_4" ... /> 
</RadioGroup> 

를 어댑터의 getView()에서,을 radioGroup 어댑터 자체에 정의 된 OnCheckedChangedListener주고 (그래서 당신은 하나의 OnCheckedChangedListener 대신 행 당 하나 있습니다). 콜백에서 구별 할 수 있도록 목록 항목의 위치로 RadioGroup에 태그를 지정합니다.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ... 
    Model model = getItem(position); 
    int checkedId = ... //figure out checked id from model 
    viewHolder.group.check(checkedId); 
    viewHolder.group.setTag(position); 
    viewHolder.group.setOnCheckedChangedListener(checkChangedListener); 
    ... 
} 

private OnCheckedChangedListener checkChangedListener = new OnCheckedChangedListener() { 
    @Override 
    public void onCheckChanged(RadioGroup group, int checkId) { 
     Object tag = group.getTag(); 
     if (!(tag instanceof Integer)) { 
      // you have a bug. Fix it! 
      return; 
     } 

     int position = (Integer) tag; 
     Model model = getItem(position); 

     switch(checkedId) { 
     case R.id.radio_button_1: 
      model.setCurrent(Model.ANSWER_ONE_SELECTED); break; 
     case R.id.radio_button_1: 
      model.setCurrent(Model.ANSWER_TWO_SELECTED); break; 
     case R.id.radio_button_1: 
      model.setCurrent(Model.ANSWER_THREE_SELECTED); break; 
     case R.id.radio_button_1: 
      model.setCurrent(Model.ANSWER_FOUR_SELECTED); break; 
     } 
    } 
}; 

이제 어댑터로 모델 목록을 가져와야합니다.

+0

문제는 사이클에서 필요한 모든 값을 가져와 배열이나 다른 것으로 집어 넣는 방법을 모르겠다는 것입니다. 그리고 난 정말 당신의 soluton 코드 사이의 차이를 얻을 수 없다는 것을 제외하고는 버튼을 클릭 얻을 onCheckedChanged insteed 데이터를 저장해야합니다. 나는 이것을 통해 onCheckedChanged 동안 얻을 수있는 것을 확인했다 : Toast.makeText (getContext(), list.get (pos) .question + ""+ list.get (pos) .current, Toast.LENGTH_SHORT) .show); 그리고 일부 랜덤 결과가 표시됩니다. – Pawt3t

+0

그럼 어댑터의 생성자에 전달 된 Model 객체 목록이 있습니다. 그래서 당신은 이미 (적어도 질문에) 당신이 그들 중 일부 데이터를 가지고 있다고 가정 했었습니다. 그밖에리스트 뷰에 그 질문을 어떻게 표시 할 수 있습니까? – Karakuri