滚动 ListView 时,Spinner setSelection 数据将消失
Spinner setSelection data is going to vanish when scrolling ListView
嗨,我是 android 的新手,在我的 ListView 中,我添加了 Spinner。
我遇到问题,当我从微调器中选择任何项目并滚动我的 ListView 时。
微调器 setSelection 数据正在消失。
请帮我解决这个问题?
主要活动:-
public class MainActivity extends AppCompatActivity {
private ArrayList<Friend> friendArrayList;
String[] countriessArray = { "USA", "USA", "USA", "USA",
"China", "Japan", "France", "USA","USA", "USA", "USA", "USA",
"China", "Japan", "France", "USA"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
friendArrayList = new ArrayList<Friend>();
for (int i = 0; i < countriessArray.length; i++) {
Friend item = new Friend(countriessArray[i]);
friendArrayList.add(item);
}
ListView listView = (ListView) findViewById(R.id.list);
ListViewAdapter adapter = new ListViewAdapter(this, R.layout.item_listview, friendArrayList);
listView.setAdapter(adapter);
}
}
ListViewAdapter:-
public class ListViewAdapter extends ArrayAdapter<Friend> implements AdapterView.OnItemSelectedListener {
private List<Friend> myFriends;
private Activity activity;
private int selectedPosition = -1;
public ListViewAdapter(Activity context, int resource, List<Friend> objects){
super(context, resource, objects);
this.activity = context;
this.myFriends = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
// If holder not exist then locate all view from UI file.
if (convertView == null) {
// inflate UI from XML file
convertView = inflater.inflate(R.layout.item_listview, parent, false);
// get all UI view
holder = new ViewHolder(convertView);
// set tag for holder
convertView.setTag(holder);
} else {
// if holder created, get tag from view
holder = (ViewHolder) convertView.getTag();
}
holder.checkBox.setTag(position); // This line is important.
holder.friendName.setText(getItem(position).getName());
if (position == selectedPosition) {
holder.checkBox.setChecked(true);
} else holder.checkBox.setChecked(false);
holder.checkBox.setOnClickListener(onStateChangedListener(holder.checkBox, position));
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("Automobile");
categories.add("Business Services");
categories.add("Computers");
categories.add("Education");
categories.add("Personal");
categories.add("Travel");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(activity, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
holder.spinner.setAdapter(dataAdapter);
holder.spinner.setOnItemSelectedListener(this);
return convertView;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// On selecting a spinner item
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
private View.OnClickListener onStateChangedListener(final CheckBox checkBox, final int position) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked()) {
selectedPosition = position;
} else {
selectedPosition = -1;
}
notifyDataSetChanged();
}
};
}
private static class ViewHolder {
private TextView friendName;
private CheckBox checkBox;
private Spinner spinner;
public ViewHolder(View v) {
checkBox = (CheckBox) v.findViewById(R.id.check);
friendName = (TextView) v.findViewById(R.id.name);
spinner = (Spinner) v.findViewById(R.id.spinnerList);
}
}
}
朋友:-
public class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
更好的方法是..
在朋友的 Pojo class 中添加选择 属性。
喜欢:
整数选择= 0;
添加 getter setter.
然后在您的 OnItemsselected 中,将其值设置为微调器的选定位置。
在您的 getview 中,您需要添加条件并从其 getter 方法中获取值。
将您的 classes 更改为以下内容:
public class Friend {
private String name;
private int selection = 0;
public Friend(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setSelection(int selection) {
this.selection = selection;
}
public int getSelection() {
return selection;
}
}
并且在您的适配器视图中,
改变这个holder.spinner.setOnItemSelectedListener(这个);
为此:
holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
getItem(position).setselection(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});;
然后在监听器之后的 getView 中,
添加
try {
holder.spinner.setSelection((getItem(viewpos)).getSelection(),false);
} catch (Exception e) {
}
这是正常的,因为每次滚动时都会调用 getView 来获取单元格的视图,并在其中重置微调项。
holder.spinner.setAdapter(数据适配器);
此行(以及初始化 dataAdapter 和设置点击侦听器的行)应放在 if (convertView == null) 块内(这是初始化单元格视图的地方)。
在 onSpinnerClick 方法中,您应该跟踪每个单元格的所选项目,并且在返回 convertView 之前,您应该设置 holder.spinner.setSelectedItem() 以便每个单元格的微调器将显示先前选择的项目
嗨,我是 android 的新手,在我的 ListView 中,我添加了 Spinner。
我遇到问题,当我从微调器中选择任何项目并滚动我的 ListView 时。 微调器 setSelection 数据正在消失。
请帮我解决这个问题?
主要活动:-
public class MainActivity extends AppCompatActivity {
private ArrayList<Friend> friendArrayList;
String[] countriessArray = { "USA", "USA", "USA", "USA",
"China", "Japan", "France", "USA","USA", "USA", "USA", "USA",
"China", "Japan", "France", "USA"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
friendArrayList = new ArrayList<Friend>();
for (int i = 0; i < countriessArray.length; i++) {
Friend item = new Friend(countriessArray[i]);
friendArrayList.add(item);
}
ListView listView = (ListView) findViewById(R.id.list);
ListViewAdapter adapter = new ListViewAdapter(this, R.layout.item_listview, friendArrayList);
listView.setAdapter(adapter);
}
}
ListViewAdapter:-
public class ListViewAdapter extends ArrayAdapter<Friend> implements AdapterView.OnItemSelectedListener {
private List<Friend> myFriends;
private Activity activity;
private int selectedPosition = -1;
public ListViewAdapter(Activity context, int resource, List<Friend> objects){
super(context, resource, objects);
this.activity = context;
this.myFriends = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
// If holder not exist then locate all view from UI file.
if (convertView == null) {
// inflate UI from XML file
convertView = inflater.inflate(R.layout.item_listview, parent, false);
// get all UI view
holder = new ViewHolder(convertView);
// set tag for holder
convertView.setTag(holder);
} else {
// if holder created, get tag from view
holder = (ViewHolder) convertView.getTag();
}
holder.checkBox.setTag(position); // This line is important.
holder.friendName.setText(getItem(position).getName());
if (position == selectedPosition) {
holder.checkBox.setChecked(true);
} else holder.checkBox.setChecked(false);
holder.checkBox.setOnClickListener(onStateChangedListener(holder.checkBox, position));
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("Automobile");
categories.add("Business Services");
categories.add("Computers");
categories.add("Education");
categories.add("Personal");
categories.add("Travel");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(activity, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
holder.spinner.setAdapter(dataAdapter);
holder.spinner.setOnItemSelectedListener(this);
return convertView;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// On selecting a spinner item
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
private View.OnClickListener onStateChangedListener(final CheckBox checkBox, final int position) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked()) {
selectedPosition = position;
} else {
selectedPosition = -1;
}
notifyDataSetChanged();
}
};
}
private static class ViewHolder {
private TextView friendName;
private CheckBox checkBox;
private Spinner spinner;
public ViewHolder(View v) {
checkBox = (CheckBox) v.findViewById(R.id.check);
friendName = (TextView) v.findViewById(R.id.name);
spinner = (Spinner) v.findViewById(R.id.spinnerList);
}
}
}
朋友:-
public class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
更好的方法是.. 在朋友的 Pojo class 中添加选择 属性。
喜欢: 整数选择= 0; 添加 getter setter.
然后在您的 OnItemsselected 中,将其值设置为微调器的选定位置。 在您的 getview 中,您需要添加条件并从其 getter 方法中获取值。
将您的 classes 更改为以下内容:
public class Friend {
private String name;
private int selection = 0;
public Friend(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setSelection(int selection) {
this.selection = selection;
}
public int getSelection() {
return selection;
}
}
并且在您的适配器视图中,
改变这个holder.spinner.setOnItemSelectedListener(这个); 为此:
holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
getItem(position).setselection(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});;
然后在监听器之后的 getView 中, 添加
try {
holder.spinner.setSelection((getItem(viewpos)).getSelection(),false);
} catch (Exception e) {
}
这是正常的,因为每次滚动时都会调用 getView 来获取单元格的视图,并在其中重置微调项。
holder.spinner.setAdapter(数据适配器); 此行(以及初始化 dataAdapter 和设置点击侦听器的行)应放在 if (convertView == null) 块内(这是初始化单元格视图的地方)。
在 onSpinnerClick 方法中,您应该跟踪每个单元格的所选项目,并且在返回 convertView 之前,您应该设置 holder.spinner.setSelectedItem() 以便每个单元格的微调器将显示先前选择的项目