在列表视图滚动时单选按钮会自动更改其状态,并且之前已在 android 中签入了一些

On Scrolling Of listview radio button is automatically changing its state and some are previously checked in android

it is list of student selected by me it is list of student already selected when i scroll list 在我的自定义列表视图中,当我是 运行 应用程序时,当我检查上方的单选按钮时,底部的单选按钮已经被选中。我如何设置单选按钮以使其状态永不改变滚动列表。

这是我的 studentlist.java

代码
public class studentlist extends AppCompatActivity  {


    private static final String TAG_RESULTS="result";
    private static final String TAG_ID = "id";
    private static final String TAG_ClassDet = "classdetails";
    private static final String TAG_YEAR = "yearof";
    private static final String TAG_BRANCH ="branchof";
    private static final String TAG_SECTION ="sectionof";

    private static String KEY_SUCCESS = "success";
    private static String KEY_ERROR = "error";


    private  ArrayList<HashMap<String, String>> studentattendence,studentstatus;
    ListView listView;
    ArrayAdapter<Model> adapter;
    List<Model> list = new ArrayList<Model>();
    public ArrayList<HashMap<String, String>> personList;
    private static final String KEY_STUDENT = "student";
    private RadioGroup radioGroup;
    private RadioButton radiobtn;
public Button ok;
    private RadioButton radioButton;
    HashMap<String, String> contact,contactstatus;
    private String convertjson;
    private String statusofattendence;


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




        listView = (ListView) findViewById(R.id.my_list);
studentattendence=new ArrayList<HashMap<String, String>>();
studentstatus=new ArrayList<HashMap<String, String>>();
        personList = new ArrayList<HashMap<String, String>>();
        Intent getstud = getIntent();
        personList = (ArrayList<HashMap<String, String>>) getstud.getSerializableExtra(KEY_STUDENT);
ok= (Button) findViewById(R.id.ok);

  Toast.makeText(getApplicationContext(), pioGroup.ersonList.get(0).get("enrolment") + "" + personList.get(1).get("enrolment") + "" + personList.get(2).get("enrolment"), Toast.LENGTH_LONG).show();


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

         radioGroup = (RadioGroup) findViewById(R.id.radio);
                          listView.childDrawableStateChanged(radioGroup);






        ////ok button click get status of each radio button and store in hashmap
        ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int child=listView.getChildCount();
                ArrayList<String> radio=new ArrayList<>();
                View[] vy = new View[1];

                Log.d("child", String.valueOf(child));
for(int i=0;i<child;i++) {
 //   RadioGroup rd = (RadioGroup) listView.getChildAt(i);


   View rgg=listView.getChildAt(i);
    Log.d("radioview",String.valueOf(rgg));
    radioGroup = (RadioGroup) rgg.findViewById(R.id.radio);
   Log.d("radiogroup", String.valueOf(radioGroup));
    int selectedId=radioGroup.getCheckedRadioButtonId();

    radioButton = (RadioButton) rgg.findViewById(selectedId);
    TextView tv= (TextView) rgg.findViewById(R.id.label);
    Log.d("radiobutton and id", selectedId + "" + radioButton);

String status= radioButton.getText().toString();
    Log.d("hello",status);

    String enrol=tv.getText().toString();
    contact = new HashMap<String, String>();
    contact.put("enrollmentnum",enrol);
    Log.d("enum",enrol);
    studentattendence.add(contact);
contactstatus = new HashMap<String, String>();
    contactstatus.put("status",status);
    Log.d("ststuss",status);
    studentstatus.add(contactstatus);

}

///here converting arraylist in to json string
                convertjson = new Gson().toJson(studentattendence);
                statusofattendence=new Gson().toJson(studentstatus);
    Toast.makeText(getApplicationContext(),""+convertjson+""+statusofattendence,Toast.LENGTH_LONG).show();
                NetAsync(v, convertjson,statusofattendence);
            }
        });

    }


    private List<Model> getModel(ArrayList<HashMap<String, String>> personList) {
        for (int i = 0; i < personList.size(); i++) {
            String enrolment = personList.get(i).get("enrolment");
            list.add(new Model(enrolment));

        }

        return list;
    }
    ////now we will send taked attendence to webservice
    private class NetCheck extends AsyncTask<String,String,Boolean>
    {
public final String convertjson,statusofattendence;
        private ProgressDialog nDialog;

        public NetCheck(String convertjson,String statusofattendence) {
            this.convertjson=convertjson;
            this.statusofattendence=statusofattendence;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            nDialog = new ProgressDialog(studentlist.this);
            nDialog.setMessage("Loading..");
            nDialog.setTitle("Checking Network");
            nDialog.setIndeterminate(false);
            nDialog.setCancelable(true);
            nDialog.show();
        }

        @Override
        protected Boolean doInBackground(String... args) {



/**
 * Gets current device state and checks for working internet connection by trying Google.
 **/
            /*
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()) {
                try {
                    URL url = new URL("http://www.google.com");
                    HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                    urlc.setConnectTimeout(3000);
                    urlc.connect();
                    if (urlc.getResponseCode() == 200) {
                        return true;
                    }
                } catch (MalformedURLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }*/
            // return false;
            return true;
        }

        @Override
        protected void onPostExecute(Boolean th) {

            if (th == true) {
                nDialog.dismiss();
                new ProcessRegister().execute();
            } else {
                nDialog.dismiss();

            }
        }
    }

    private class ProcessRegister extends AsyncTask<String, String, JSONObject> {


        private ProgressDialog pDialog;

        String forgotpassword;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(studentlist.this);
            pDialog.setTitle("Contacting Servers");
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected JSONObject doInBackground(String... args) {

TeacherFunctions userFunction = new TeacherFunctions();
            Log.d("convertjson",convertjson);
                        Log.d("convertjson",statusofattendence);
            JSONObject json = userFunction.addAttendence(convertjson,statusofattendence);

            return json;
        }


        @Override
        protected void onPostExecute(JSONObject json) {
            /**
             * Checks if the Password Change Process is sucesss
             **/
            try {
                if (json.getString(KEY_SUCCESS) != null) {

                    String res = json.getString(KEY_SUCCESS);
                    String red = json.getString(KEY_ERROR);


                    if(Integer.parseInt(res) == 1){
                        pDialog.dismiss();

                        Toast.makeText(getApplicationContext(),"students Attendence Uploaded successfully"+json.getString("user"),Toast.LENGTH_LONG).show();


                    }
                    else if (Integer.parseInt(red) == 2)
                    {    pDialog.dismiss();
                    }
                    else {
                        pDialog.dismiss();

                    }




                }}
            catch (JSONException e) {
                e.printStackTrace();

                pDialog.dismiss();

                Toast.makeText(getApplicationContext()," not Uploaded successfully"+e,Toast.LENGTH_LONG).show();

            }
        }}
    public void NetAsync(View view, String convertjson,String statusofattendence){
        new NetCheck(convertjson,statusofattendence).execute();
    }
}

model.java

代码
public class Model {

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

MyAdapter.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 RadioButton radiobox;
    }

    @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.radiobox = (RadioButton) convertView.findViewById(R.id.radio1);
            viewHolder.radiobox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });
            convertView.setTag(viewHolder);
            convertView.setTag(R.id.label, viewHolder.text);
            convertView.setTag(R.id.radio1, viewHolder.radiobox);
            } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.radiobox.setTag(position); // This line is important.

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

        return convertView;
    }
}

您正在 viewHolder.radiobox 上使用 setOnCheckedChangeListener()。这是非常糟糕的代码,因为每次 convertView 得到 nullview 然后 setOnCheckedChangeListener() 也被调用。它将您的模态数据设置到下一个位置。如果您想检查它,只需将 Log 放入 onCheckedChange 或尝试在其中放置断点。 试试这个:

@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.radiobox = (RadioButton) convertView.findViewById(R.id.radio1);

            convertView.setTag(viewHolder);
            convertView.setTag(R.id.label, viewHolder.text);
            convertView.setTag(R.id.radio1, viewHolder.radiobox);
            } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

 viewHolder.radiobox.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) 
{
     if(viewHolder.radiobox.isChecked())
{
viewHolder.radiobox.setChecked(false);
}
else
{
viewHolder.radiobox.setChecked(true);
}               
                    list.get(getPosition).setChecked( viewHolder.radiobox.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });

        viewHolder.text.setText(list.get(position).getName());
        viewHolder.radiobox.setChecked(list.get(position).isChecked());

        return convertView;
    }

希望对您有所帮助。

enter code here
 getListView().setOnScrollListener(this);***

enter code here

public void onScroll(AbsListView view, int firstCell, int cellCount, int itemCount) {

   RadioButton rb1 = (RadioButton) findViewById(R.id.option1);
rb1.setChecked(flase);
}

public void onScrollStateChanged(AbsListView view, int scrollState) {        
}

实际上一切都不正常,然后我用 4 个按钮代替了单选按钮。