Smooth scrolling to the next item in list view after radio buttons are selected

你离开我真会死。 提交于 2020-01-06 05:38:06

问题


How to smooth scroll to the next item in the listview after user click on yes or no radio buttons in radio group. For example. If user answered yes or no to the first question it should smooth scroll to the second question. I found the below code and it is working with static position value, but I don't know how to scroll to the next index(next question) on select of radio group(yes or no radio buttons).

 int index = 0;
    int h1 = simpleListView.getHeight();
    int h2 = simpleListView.getHeight();
    int duration=500;
    simpleListView.smoothScrollToPositionFromTop(index+4, h1/2 - h2/2, duration);

1) MainActivity_.class:-----------------

public class MainActivity_ extends AppCompatActivity {

private ListView lv;
private CustomAdapter customAdapter;
private String[] questions;
private Button submit;
private Button clear;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout8);

    questions = new String[10];

    for(int i = 0 ; i<10 ; i++){
        questions[i] = "Q " + i;
    }

    lv = (ListView) findViewById(R.id.lv);
    customAdapter = new CustomAdapter(getApplicationContext() , questions);
    lv.setAdapter(customAdapter);

    submit = (Button) findViewById(R.id.submit);
    submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            boolean found_unanswered = false;
            int index_first_unanswered = 0;
            List<Integer> backgroundColor = new ArrayList<Integer>(); // new
            if(customAdapter != null){
                for(int i = 0 ; i<customAdapter.getSelectedAnswers().size() ; i++){
                    if(customAdapter.getSelectedAnswers().get(i).equals("3")){
                        if(!found_unanswered) { // new
                            found_unanswered = true;
                            index_first_unanswered = i; // new
                        }
                        backgroundColor.add(Color.RED); // new
                    }else{ // new
                        backgroundColor.add(Color.WHITE);
                    }
                }
            }

                if(!found_unanswered) {
                    Toast.makeText(getApplicationContext(), "All Answered", Toast.LENGTH_LONG).show();
                    customAdapter.setBackgroundColor(backgroundColor); // new
                    //Go to other activity
                }else{ // new
                    Toast.makeText(getApplicationContext(), "Found Unanswered", Toast.LENGTH_LONG).show();
                    if(customAdapter != null && lv != null){
                        customAdapter.setBackgroundColor(backgroundColor);
                        lv.smoothScrollToPosition(index_first_unanswered);
                    }
                }
        }
    });

    clear = (Button) findViewById(R.id.clear);
    clear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (customAdapter != null) {
                customAdapter.clearSelectedAnswers();
            }
        }
    });

}


}

2) CustomAdapter.class:----------------

public class CustomAdapter extends BaseAdapter {

Context context;
String[] questionsList;
LayoutInflater inflter;
private List<String> selectedAnswers;
private List<Integer> backgroundColor; // new


public CustomAdapter(Context context, String[] questionsList) {
    this.context = context;
    this.questionsList = questionsList;
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>(); // new
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE); // new
    }
    inflter = (LayoutInflater.from(context));
}

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

@Override
public Object getItem(int i) {
    return questionsList[i];
}

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

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

@Override
public int getItemViewType(int i) {
    return i;
}

@Override
public View getView(final int i, View convertView, ViewGroup viewGroup) {

    View view = convertView;

    if (convertView == null) {
        if (inflter != null) {
            view = inflter.inflate(R.layout.list_items, null);
        }
    }


    TextView question = (TextView) view.findViewById(R.id.question);
    question.setText(questionsList[i]);
    question.setBackgroundColor(backgroundColor.get(i)); // new

    // initialize/re-restore UI Radio Button State
    final RadioGroup rg = (RadioGroup) view.findViewById(R.id.radio_group);
    RadioButton rb_yes = (RadioButton) rg.findViewById(R.id.yes);
    RadioButton rb_no = (RadioButton) rg.findViewById(R.id.no);
    if(selectedAnswers.get(i).equals("1")){
        rg.check(R.id.yes);
        rb_yes.setBackgroundColor(Color.GREEN);
        rb_no.setBackgroundColor(Color.GRAY);
    }else if(selectedAnswers.get(i).equals("2")){
        rg.check(R.id.no);
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.BLACK);
    }else {
      // no answer.
        rg.clearCheck(); // new
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.GRAY);
    }

    rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            RadioButton rb_yes = (RadioButton) group.findViewById(R.id.yes);
            RadioButton rb_no = (RadioButton) group.findViewById(R.id.no);
            //Toast.makeText(context , (checkedId == R.id.yes)?"yes":"no" , Toast.LENGTH_LONG).show();
            switch (checkedId){
                case R.id.yes:
                    rb_yes.setBackgroundColor(Color.GREEN);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "1");
                    break;
                case R.id.no:
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.BLACK);
                    selectedAnswers.set(i, "2");
                    break;
                default: // new
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "3");
                    break;
            }
        }
    });

    return view;
}

public List<String> getSelectedAnswers(){
    return selectedAnswers;
}

public void clearSelectedAnswers(){
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE); // new
    }
    this.notifyDataSetChanged();
}

public void setBackgroundColor(List<Integer> backgroundColor_){ // new
    this.backgroundColor = backgroundColor_;
    this.notifyDataSetChanged();
}

}

3) layout_8.xml:---------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100"
android:orientation="vertical">

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="90"
    android:id="@+id/lv">
</ListView>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_weight="10"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:orientation="horizontal">

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Submit"
        android:layout_toStartOf="@id/v"
        android:textAllCaps="false"
        android:id="@+id/submit"/>

    <View
        android:layout_width="1dp"
        android:layout_height="0dp"
        android:id="@+id/v"
        android:layout_centerInParent="true">
    </View>

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Clear"
        android:layout_toEndOf="@id/v"
        android:textAllCaps="false"
        android:id="@+id/clear"/>

</RelativeLayout>

</LinearLayout>

4) list_items.xml:--------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">
<!-- TextView for displaying question-->
<TextView
    android:id="@+id/question"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textColor="#000"
    android:textSize="30dp"
    android:text="Which is your most favorite?"
    />
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/main">
    <RadioGroup
        android:id="@+id/radio_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="YES"
            android:textSize="50dp" />
        <RadioButton
            android:id="@+id/no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="NO"
            android:textSize="50dp" />
    </RadioGroup>
</FrameLayout>

</LinearLayout>

回答1:


make interface into adapter class for handling click event like this way..

    onRadioItemClick  onRadioItemClick;
interface onRadioItemClick{
    void onCheck(String str); // if you want pass any data when you need
}

public void setOnRadioItemClick(GalleryAdater.onRadioItemClick onRadioItemClick) {
    this.onRadioItemClick = onRadioItemClick;
}

after click on radio button put value interface like this way..

        case R.id.yes:
    rb_yes.setBackgroundColor(Color.GREEN);
    rb_no.setBackgroundColor(Color.GRAY);
    onRadioItemClick.onCheck(selectedAnswers.get(i);

after that adapter bind into list view then called below code..

  galleryAdater.setOnRadioItemClick(new GalleryAdater.onRadioItemClick() {
        @Override
        public void onCheck(String str) {
            stringsList.set(strings.indexOf(str),"1");
            galleryAdater.notifyDataSetChanged();

        }
    });



回答2:


Try the following:

1) CustomAdapter.class:--------

public class CustomAdapter extends BaseAdapter {

Context context;
String[] questionsList;
LayoutInflater inflter;
private List<String> selectedAnswers;
private List<Integer> backgroundColor;


public CustomAdapter(Context context, String[] questionsList) {
    this.context = context;
    this.questionsList = questionsList;
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE);
    }
    inflter = (LayoutInflater.from(context));
}

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

@Override
public Object getItem(int i) {
    return questionsList[i];
}

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

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

@Override
public int getItemViewType(int i) {
    return i;
}

@Override
public View getView(final int i, View convertView, final ViewGroup viewGroup) {

    View view = convertView;

    if (convertView == null) {
        if (inflter != null) {
            view = inflter.inflate(R.layout.list_items, null);
        }
    }

    final LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll); // new

    final TextView question = (TextView) view.findViewById(R.id.question);
    question.setText(questionsList[i]);
    question.setBackgroundColor(backgroundColor.get(i));

    // initialize/re-restore UI Radio Button State
    final RadioGroup rg = (RadioGroup) view.findViewById(R.id.radio_group);
    final RadioButton rb_yes = (RadioButton) rg.findViewById(R.id.yes);
    final RadioButton rb_no = (RadioButton) rg.findViewById(R.id.no);
    if(selectedAnswers.get(i).equals("1")){
        rg.check(R.id.yes);
        rb_yes.setBackgroundColor(Color.GREEN);
        rb_no.setBackgroundColor(Color.GRAY);
    }else if(selectedAnswers.get(i).equals("2")){
        rg.check(R.id.no);
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.BLACK);
    }else {
        // no answer.
        rg.clearCheck();
        rb_yes.setBackgroundColor(Color.GRAY);
        rb_no.setBackgroundColor(Color.GRAY);
    }

    rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            RadioButton rb_yes = (RadioButton) group.findViewById(R.id.yes);
            RadioButton rb_no = (RadioButton) group.findViewById(R.id.no);
            //Toast.makeText(context , (checkedId == R.id.yes)?"yes":"no" , Toast.LENGTH_LONG).show();
            switch (checkedId) {
                case R.id.yes:
                    rb_yes.setBackgroundColor(Color.GREEN);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "1");
                    scrollToNext((ListView) viewGroup, ll, i , 1); // new
                    break;
                case R.id.no:
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.BLACK);
                    selectedAnswers.set(i, "2");
                    scrollToNext((ListView) viewGroup, ll, i , 1); // new
                    break;
                default:
                    rb_yes.setBackgroundColor(Color.GRAY);
                    rb_no.setBackgroundColor(Color.GRAY);
                    selectedAnswers.set(i, "3");
                    break;
            }
        }
    });

    return view;
}

public List<String> getSelectedAnswers(){
    return selectedAnswers;
}

public void clearSelectedAnswers(){
    selectedAnswers = new ArrayList<String>();
    backgroundColor = new ArrayList<Integer>();
    for (int i = 0; i < questionsList.length; i++) {
        selectedAnswers.add("3");
        backgroundColor.add(Color.WHITE);
    }
    this.notifyDataSetChanged();
}

public void setBackgroundColor(List<Integer> backgroundColor_){
    this.backgroundColor = backgroundColor_;
    this.notifyDataSetChanged();
}

private void scrollToNext(ListView parent , LinearLayout item , int index , int which) { // new

    // added two cases choose between one or two and delete the other one.
    int duration = 500;
    switch (which) {
        case 1:
            parent.smoothScrollToPositionFromTop((index + 1), item.getTop() - (parent.getHeight() / 2) + (parent.getHeight() / 2), duration);
            break;
        case 2:
            parent.smoothScrollToPositionFromTop((index + 1), (parent.getHeight() / 2) - (item.getHeight() / 2), duration);
            break;
        default:
            parent.smoothScrollToPositionFromTop((index + 1), item.getTop() - (parent.getHeight() / 2) + (parent.getHeight() / 2), duration);
            break;
    }

}

}

2) list_items.xml:------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ll"
android:orientation="vertical">
<!-- TextView for displaying question-->
<TextView
    android:id="@+id/question"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:textColor="#000"
    android:textSize="30dp"
    android:text="Which is your most favorite?"
    />
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/main">
    <RadioGroup
        android:id="@+id/radio_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="YES"
            android:textSize="50dp" />
        <RadioButton
            android:id="@+id/no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:button="@null"
            android:paddingHorizontal="30dp"
            android:paddingVertical="5dp"
            android:text="NO"
            android:textSize="50dp" />
    </RadioGroup>
</FrameLayout>

</LinearLayout>

3) In the above code, I added a function called scrollToNext(...). Inside this function you have to two ways to scroll, so after deciding which one suits you most, remove the switch case and directly call parent.smoothScrollToPositionFromTop(...).



来源:https://stackoverflow.com/questions/51923390/smooth-scrolling-to-the-next-item-in-list-view-after-radio-buttons-are-selected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!