6

Tôi đang tạo ứng dụng android giao diện người dùng của ứng dụng của tôi dưới đây được đưa ra.Listview với Checkbox, RadioButton, Textview và nút không hoạt động chính xác trong android

Khi nhấp vào nút gửi, tôi cần hộp kiểm đã chọn và giá trị nút radio.

Ví dụ Linux không được chọn, cc (nút radio) được chọn.

Bản ghi được điền động trong chế độ xem danh sách, nhưng tôi không thể làm cho nó hoạt động. Rất nhiều vấn đề về .

  1. Khi tôi cuộn nút radio chế độ xem danh sách sẽ tự động được chọn hoặc bỏ chọn không thể duy trì trạng thái nút radio.
  2. Khi nhấp vào nút không nhận được nút radio đã chọn cũng như hộp kiểm.

Dưới đây là bố cục của tôi cũng như chương trình java. Đề nghị tôi để có được các giá trị chính xác.

application image

main.xml

<ListView 
    android:id="@+id/my_list" 
    android:layout_width="fill_parent" 
    android:layout_height="199dp" /> 

<Button 
    android:id="@+id/submit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Submit" 
    /> 

row.xml

<TextView 
    android:id="@+id/label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:layout_toRightOf="@+id/check" 
    android:textSize="20sp" > 
</TextView> 

<CheckBox 
    android:id="@+id/check" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="4dip" 
    android:layout_marginRight="10dip" 
    android:focusable="false" 

    android:focusableInTouchMode="false" > 
</CheckBox> 

<RadioGroup 
    android:id="@+id/radioSex" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:orientation="horizontal" > 

    <RadioButton 
     android:id="@+id/to" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:checked="true" 
     android:text="To" /> 

    <RadioButton 
     android:id="@+id/cc" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:text="CC" /> 
</RadioGroup> 

MyAdaptor.java

public class MyAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

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

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) convertView 
        .findViewById(R.id.check); 

      viewHolder.checkbox 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
          int getPosition = (Integer) buttonView.getTag(); 
          list.get(getPosition).setSelected(
            buttonView.isChecked()); 
         } 
        }); 
      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.label, viewHolder.text); 
      convertView.setTag(R.id.check, viewHolder.checkbox); 

     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.checkbox.setTag(position); 

     viewHolder.text.setText(list.get(position).getName()); 
     viewHolder.checkbox.setChecked(list.get(position).isSelected()); 

     return convertView; 
    } 

MainActivity.java

public class MainActivity extends Activity implements OnItemClickListener { 

    ListView listView; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 

    private RadioGroup radioCcToGroup; 
    private RadioButton radioTypeButton; 
    private Button btn; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     listView = (ListView) findViewById(R.id.my_list); 

     btn = (Button) findViewById(R.id.submit); 

     btn.setOnClickListener(new View.OnClickListener() { 
      int count = 0; 

      @Override 
      public void onClick(View view) { 


       count = listView.getAdapter().getCount(); 
       for (int i = 0; i < count; i++) { 
        // here i am not able to get the records as getting on onItemClick of the listview 
       } 
      } 
     }); 

     adapter = new MyAdapter(this, getModel()); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(this); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
     TextView label = (TextView) v.getTag(R.id.label); 
     CheckBox checkbox = (CheckBox) v.getTag(R.id.check); 
     Toast.makeText(v.getContext(), 
       label.getText().toString() + " " + isCheckedOrNot(checkbox), 
       Toast.LENGTH_LONG).show(); 

    } 

    private String isCheckedOrNot(CheckBox checkbox) { 
     if (checkbox.isChecked()) 
      return "is checked"; 
     else 
      return "is not checked"; 
    } 

    private List<Model> getModel() { 
     list.add(new Model("Linux")); 
     list.add(new Model("Windows7")); 
     list.add(new Model("Suse")); 
     list.add(new Model("Eclipse")); 
     list.add(new Model("Ubuntu")); 
     list.add(new Model("Solaris")); 
     list.add(new Model("Android")); 
     list.add(new Model("iPhone")); 
     list.add(new Model("Java")); 
     list.add(new Model(".Net")); 
     list.add(new Model("PHP")); 
     return list; 
    } 

Model.java

private String name; 
    private boolean selected; 

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

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

Trả lời

8

Bạn có 2 sai lầm ở đây cả trên MyAdaptor.java bạn:

  1. Khi bạn cắm onCheckedChangeListener bạn làm điều đó chỉ khi một cái nhìn mới cần phải được tạo và bạn quên trường hợp chế độ xem danh sách từ chối chế độ xem. Bạn nên setOnCheckedChangeListener bên ngoài if (convertView == null).

  2. Dường như onCheckedChangeListener cũng được gọi khi cuộn được thực hiện (vì viewHolder.checkbox.setChecked(list.get(position).isSelected());). Bạn có thể tránh điều này bằng cách sử dụng OnClickListener trên viewHolder.checkbox hoặc không gọi số viewHolder.checkbox.setChecked().

Đây là mã của tôi:

private class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
    protected RadioGroup radioGroup; 
} 

public class MyAdapter extends ArrayAdapter<Model> { 

    private final List<Model> list; 
    private final Activity context; 
    boolean checkAll_flag = false; 
    boolean checkItem_flag = false; 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      convertView = inflator.inflate(R.layout.row, null); 

      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
      viewHolder.checkbox.setTag(position); 
      viewHolder.radioGroup = (RadioGroup) convertView.findViewById(R.id.radioSex); 
      viewHolder.radioGroup.setTag(position); 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.text.setText(list.get(position).getName()); 
     viewHolder.checkbox.setChecked(list.get(position).isSelected()); 
     viewHolder.checkbox.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CheckBox checkbox = (CheckBox) v; 
       int getPosition = (Integer) checkbox.getTag(); 
       list.get(getPosition).setSelected(checkbox.isChecked()); 
      } 
     }); 

     viewHolder.radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       boolean isCcOrIsTo = (checkedId == R.id.cc); 
       int getPosition = (Integer) group.getTag(); 
       list.get(getPosition).setCcOrIsTo(isCcOrIsTo); 
      } 
     }); 

     return convertView; 
    } 
} 

Thông báo tôi đã thêm một số kiểm soát RadioGroup quá, vì vậy Model.java đã thay đổi:

public class Model { 

    private String name; 
    private boolean selected; 
    private boolean isCcOrIsTo; 

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

    public String getName() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

    public boolean isCcOrIsTo() { 
     return isCcOrIsTo; 
    } 

    public void setCcOrIsTo(boolean isCcOrIsTo) { 
     this.isCcOrIsTo = isCcOrIsTo; 
    } 

    @Override 
    public String toString() { 
     String selectedString = selected ? "selected" : "not selected"; 
     String value = isCcOrIsTo ? "CC" : "To"; 
     return name+" -> "+selectedString+ " with value "+value; 
    } 
} 

Cuối cùng, bạn don không cần onItemClick trên MainActivity.java, để kiểm tra xem các giá trị có chính xác không khi bạn nhấp vào nút hội nghị thượng đỉnh:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.my_list); 

    btn = (Button) findViewById(R.id.submit); 

    btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      for (Model m : list) { 
       Log.i("Stack1", m.toString()); 
      } 
     } 
    }); 

    ArrayAdapter<Model> adapter = new MyAdapter(this, getModel()); 
    listView.setAdapter(adapter); 
} 

Hy vọng nó giúp;)

+0

Cảm ơn, @Kalem, nhưng vẫn còn nếu tôi di chuyển listview nó được chọn tự động. Nếu tôi không chọn bất kỳ tùy chọn nút radio nào và sau đó cuộn không có hiệu lực nhưng trong trường hợp nếu bạn chọn bất kỳ tùy chọn nào trong số đó. – subodh

+0

Lạ lùng, tôi không gặp vấn đề đó khi tôi thử nghiệm, tôi sẽ xem xét điều đó một lần nữa. Chỉ cần được rõ ràng, bạn đã thay thế 'setOnCheckedChangeListener'? Bạn cũng có thể kiểm tra nếu nó không đến từ: 'viewHolder.checkbox.setChecked (list.get (position) .isSelected());' – Kalem

+0

Tôi chỉ sao chép và dán mã của bạn nhưng trong trường hợp hộp kiểm nó hoạt động tốt thậm chí tôi đã nhận được tất cả phản hồi một cách chính xác. nhưng khi tôi chọn bất kỳ nút radio và cuộn nào, nó chọn nhiều nút radio trong giao diện người dùng nhưng khi tôi gửi trang, nó chỉ hiển thị cái được mong đợi nhưng trong giao diện người dùng hiển thị nhiều như được chọn. – subodh

Các vấn đề liên quan