选择单选按钮后,可平滑滚动到列表视图中的下一个项目 [英] Smooth scrolling to the next item in list view after radio buttons are selected
问题描述
在用户单击单选组中的是"或否"单选按钮后,如何平滑滚动到列表视图中的下一项. 例如.如果用户对第一个问题回答是"或否",则应平滑滚动至第二个问题. 我找到了下面的代码,它正在使用静态位置值,但是我不知道如何在选择单选组(是或没有单选按钮)时滚动到下一个索引(下一个问题).
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:-----------------
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:----------------
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:---------
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:--------
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>
推荐答案
将接口转换为适配器类,用于以这种方式处理click事件.
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();
}
});
这篇关于选择单选按钮后,可平滑滚动到列表视图中的下一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!