簡體   English   中英

單選按鈕被取消並在列表視圖滾動中自動檢查

[英]Radio Button gets uncked and automatically checked in listview scrolling

我有一個程序,其中我有多個問題和2個選項(radiobuttons)當我檢查1並滾動列表視圖它取消選中。 我將發布整個代碼,請幫我解決。 我認為適配器類有問題

主要活動

public class MainActivity extends AppCompatActivity {

ListView simpleList;
String[] questions;
Button submit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // get the string array from string.xml file
    questions = getResources().getStringArray(R.array.questions);
    // get the reference of ListView and Button
    simpleList = (ListView) findViewById(R.id.simpleListView);
    submit = (Button) findViewById(R.id.submit);
    // set the adapter to fill the data in the ListView
    CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), questions);
    simpleList.setAdapter(customAdapter);
    // perform setOnClickListerner event on Button
    submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String message = "";
            // get the value of selected answers from custom adapter
            for (int i = 0; i < CustomAdapter.selectedAnswers.size(); i++) {
                message = message + "\n" + (i + 1) + " " + CustomAdapter.selectedAnswers.get(i);
            }
            // display the message on screen with the help of Toast.
            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
        }
    });
}

定制適配器

public class Questions_Adapter extends BaseAdapter {

Activity context;
String[] questionsList;
String age_range;
LayoutInflater inflter;
public static ArrayList<Integer> selectedAnswers;

public Questions_Adapter(Activity applicationContext, String[] questionsList, String age_range) {

    context             = applicationContext;
    this.questionsList  = questionsList;
    this.age_range      = age_range;

    // initialize arraylist and add string for all the questions
    selectedAnswers = new ArrayList<>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add(0);
    }
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    return questionsList.length;
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}


private class Viewholder{

    TextView question;
    RadioButton op1, op2, op3, op4, op5, op6;

}


@Override
public View getView(final int position, View view, ViewGroup viewGroup) {


    Viewholder viewholder;

    LayoutInflater inflater = context.getLayoutInflater();

    if (view == null){

        viewholder = new Viewholder();
        view = inflater.inflate(R.layout.list_items,null);

        viewholder.question = (TextView) view.findViewById(R.id.question);

        viewholder.op1     = (RadioButton) view.findViewById(R.id.yes);
        viewholder.op2     = (RadioButton) view.findViewById(R.id.no);
        viewholder.op3     = (RadioButton) view.findViewById(R.id.op);
        viewholder.op4     = (RadioButton) view.findViewById(R.id.op4);
        viewholder.op5     = (RadioButton) view.findViewById(R.id.op5);
        viewholder.op6     = (RadioButton) view.findViewById(R.id.op6);

        view.setTag(viewholder);

    }
    else {

        viewholder = (Viewholder) view.getTag();
    }


    // perform setOnCheckedChangeListener event on yes button
    viewholder.op1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(position, 1);
        }
    });

    viewholder.op2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked)
                selectedAnswers.set(position, 2);

        }
    });

    viewholder.op3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked)
                selectedAnswers.set(position, 3);

        }
    });

    viewholder.op4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked)
                selectedAnswers.set(position, 4);

        }
    });

    viewholder.op5.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked)
                selectedAnswers.set(position, 10);

        }
    });

    viewholder.op6.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked)
                selectedAnswers.set(position, 0);

        }
    });

    // set the value in TextView
    viewholder.op1.setText("None or Little of a time");
    viewholder.op2.setText("Some of the time");
    viewholder.op3.setText("A good part of the time");
    viewholder.op4.setText("Most or All of the time");
    viewholder.op5.setText("Yes");
    viewholder.op6.setText("No");
    viewholder.question.setText(questionsList[position]);

    if(age_range.equals("ZSDS")){

        viewholder.op5.setVisibility(View.GONE);
        viewholder.op6.setVisibility(View.GONE);

    }
    if(age_range.equals("GDS")){

        viewholder.op1.setVisibility(View.GONE);
        viewholder.op2.setVisibility(View.GONE);
        viewholder.op3.setVisibility(View.GONE);
        viewholder.op4.setVisibility(View.GONE);

    }

    return view;
}
}

基本上你的視圖是在每次滾動后重新生成的,因為你沒有檢查視圖是否為null

您必須檢查第一個視圖並使用持有者,而不是每次都創建小部件的新對象。 這是解決方案希望,它將與您的列表視圖一起使用。

public class CustomAdapter extends BaseAdapter {
static class ViewHolder {
        TextView question ;
        RadioButton yes,no;

    }
Context context;
String[] questionsList;
LayoutInflater inflter;
public static List<String> selectedAnswers;

public CustomAdapter(Context applicationContext, String[] questionsList) {
    context = applicationContext;
    this.questionsList = questionsList;
    // initialize arraylist and add static string for all the questions
    selectedAnswers = new ArrayList<>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("Not Attempted");
    }
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    return questionsList.length;
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
     ViewHolder holder = new ViewHolder();
if(view==null){
    view = inflter.inflate(R.layout.list_items, null);
    // get the reference of TextView and Button's
    holder.question = (TextView) view.findViewById(R.id.question);
    holder.yes = (RadioButton) view.findViewById(R.id.yes);
    holder.no = (RadioButton) view.findViewById(R.id.no);
    // perform setOnCheckedChangeListener event on yes button
view.setTag(holder);
}else{
holder = (ViewHolder) view.getTag();
}
    holder.yes.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(i, "Yes");
        }
    });
    // perform setOnCheckedChangeListener event on no button
    holder.no.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set No values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(i, "No");

        }
    });
    // set the value in TextView
    question.setText(questionsList[i]);
    return view;
}
}

首先,您需要在模型中保存tick(復選框選擇) ,例如isSelected = true並調用notifyDataSetChanged 然后在getView()方法中你需要檢查這個標志並根據它設置復選框狀態。

滾動時,視圖將被回收以顯示項目,因此選擇不在視圖范圍內的其他舊列表項目將會出現錯誤項目。 因此,在調用get視圖時,需要重置單選按鈕的選擇。

因此,您可以在getVeiw()方法中添加以下代碼,以使選擇正常工作

    if(position < selectedAnswers.size() && selectedAnswers.get(position) != null) {
    switch(selectedAnswers.get(position)) {
        case 1:
            viewholder.op1.setChecked(true);
            break;
        case 2:
            viewholder.op2.setChecked(true);
            break;            
        case 3:
            viewholder.op3.setChecked(true);
            break;            
        case 4:
            viewholder.op4.setChecked(true);
            break;
        case 10:
            viewholder.op5.setChecked(true);
            break;
        case 0:
            viewholder.op6.setChecked(true);
            break;
        default:
            viewholder.op1.setChecked(false);
            viewholder.op2.setChecked(false);
            viewholder.op3.setChecked(false);
            viewholder.op4.setChecked(false);
            viewholder.op5.setChecked(false);
            viewholder.op6.setChecked(false);
    }
}

這將在列表視圖的滾動上設置您選擇的單選按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM