6

में सही ढंग से काम नहीं कर रहा है मैं अपने एंड्रॉइड ऐप का निर्माण कर रहा हूं, मेरे आवेदन का यूआई नीचे दिया गया है।चेकबॉक्स, रेडियोबटन, टेक्स्टव्यू और बटन के साथ सूचीदृश्य एंड्रॉइड

सबमिट बटन पर क्लिक करने पर, मुझे चयनित चेक बॉक्स और रेडियो बटन मान की आवश्यकता है।

उदाहरण लिनक्स की जांच नहीं की गई है, सीसी (रेडियो बटन) की जांच की गई है।

रिकॉर्ड्स सूची दृश्य में गतिशील रूप से आबादी वाले हैं, लेकिन मैं इसे काम करने में सक्षम नहीं हूं। की बहुत सारी समस्याएं हैं।

  1. जब मैं स्क्रॉल सूची दृश्य रेडियो बटन स्वचालित रूप से चयनित या रेडियो बटन की स्थिति बनाए रखने में सक्षम नहीं का चयन रद्द हो जाता है।
  2. बटन के क्लिक पर चयनित रेडियो बटन और साथ ही चेक बॉक्स नहीं मिल रहा है।

नीचे मेरा लेआउट के साथ-साथ जावा प्रोग्राम भी है। सही मूल्य प्राप्त करने के लिए मुझे सुझाव दें।

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; 
    } 

उत्तर

8

आप अपने MyAdaptor.java पर यहां दोनों 2 गलतियों मिला:

  1. जब आप देते हैं onCheckedChangeListener आप यह कर केवल जब कोई नया दृश्य बनाने की आवश्यकता है और आप उस मामले को भूल जाते हैं जहां सूची दृश्य दृश्य का पुन: उपयोग करता है। if (convertView == null) के बाहर आपको setOnCheckedChangeListener होना चाहिए।

  2. ऐसा लगता है कि स्क्रॉल किए जाने पर चेक किए गए चेंजलिस्टर को भी कहा जाता है (viewHolder.checkbox.setChecked(list.get(position).isSelected()); की वजह से)। आप OnClickListenerviewHolder.checkbox से अधिक या viewHolder.checkbox.setChecked() पर कॉल करके इसका उपयोग करके बच सकते हैं।

    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; 
        } 
    } 
    

    सूचना मैं भी RadioGroup पर कुछ नियंत्रण जोड़ दिया है, इसलिए Model.java बदल गया है:

    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; 
        } 
    } 
    

    अंत में आप डॉन

यहाँ मेरी कोड है मेनएक्टिविटी.जावा पर, यह जांचने के लिए कि जब आप शिखर बटन पर क्लिक करते हैं तो मान सही होते हैं या नहीं:

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); 
} 

आशा है कि यह मदद करता है;)

+0

धन्यवाद, @Kalem, लेकिन अभी भी अगर मैं सूचीदृश्य स्क्रॉल यह स्वचालित रूप से चयन किया जाता है। अगर मैं किसी भी रेडियो बटन विकल्प का चयन नहीं करता हूं और फिर स्क्रॉलिंग प्रभावी नहीं होती है, लेकिन यदि उनमें से किसी एक का चयन करें। – subodh

+0

अजीब, जब मैंने परीक्षण किया, तो मुझे उस समस्या का सामना नहीं हुआ, मैं इसे एक और बार देख लूंगा। बस स्पष्ट होने के लिए, क्या आपने 'setOncheckedChangeListener' को प्रतिस्थापित किया था? यदि आप इससे नहीं आते हैं तो आप चेकआउट भी कर सकते हैं: 'viewHolder.checkbox.set चेक (list.get (position) .isSelected());' – Kalem

+0

मैं बस अपना कोड कॉपी और पेस्ट करता हूं लेकिन चेक बॉक्स के मामले में यह ठीक काम करता है यहां तक ​​कि मुझे सभी प्रतिक्रिया सही ढंग से मिली। लेकिन जब मैं रेडियो बटन में से किसी एक को चुनता हूं और स्क्रॉल करता हूं, तो यह यूआई में एक से अधिक रेडियो बटन का चयन करता है, लेकिन जब मैं पेज सबमिट करता हूं तो यह केवल वही दिखाता है जिसकी अपेक्षा की जाती है लेकिन यूआई में चेक के रूप में एकाधिक दिखाता है। – subodh