当我把它的滚动复选框微调适配器自动检查 [英] Checkbox in Spinner adapter is automatically checked when I scroll it
问题描述
我有什么:我有一个微调,敌人我已经设置了适配器,在男女混合显示适配器下面有一个复选框
和一个的TextView
这是怎么回事 ::当我选中复选框,在一排和下面的滚动,在下面的适配器的一些项目被自动选中。还当我回到前面,我检查了适配器也仍然检查
我试图做什么:: 我怎样才能在适配器preserve正确选择复选框所有德时间。当我向上和向下滚动
AdptCategories.java
公共类AdptCategories扩展了BaseAdapter {
ArrayList的< HashMap的<字符串,字符串>> categorySpinnerData;
上下文语境;
// ArrayList的<的ListObject>对象;
公共AdptCategories(ArrayList中< HashMap的<字符串,字符串>> _categorySpinnerData,上下文_context){
超();
上下文= _context;
categorySpinnerData = _categorySpinnerData;
}
@覆盖
公众诠释getCount将(){
返回categorySpinnerData.size();
}
@覆盖
公共对象的getItem(INT位置){
返回categorySpinnerData.get(位置);
}
@覆盖
众长getItemId(INT位置){
返回0;
}
公共查看getView(INT位置,查看convertView,ViewGroup中父){
HashMap的<字符串,字符串> mapData = categorySpinnerData.get(位置);
如果(convertView == NULL){
LayoutInflater mInflater =(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.adpt_categories_spinner,NULL);
}
TextView的txtCategoryNameId =(TextView中)convertView.findViewById(R.id.txtCategoryNameId);
复选框categoryChkBxId =(复选框)convertView.findViewById(R.id.categoryChkBxId);
如果(位置== 0){
txtCategoryNameId.setText(mapData.get(名字));
categoryChkBxId.setVisibility(View.INVISIBLE);
}其他{
txtCategoryNameId.setText(mapData.get(名字));
txtCategoryNameId.setTag(mapData.get(ID));
categoryChkBxId.setVisibility(View.VISIBLE);
}
返回convertView;
}
}
{编辑}
公共类AdptCategories扩展了BaseAdapter {
ArrayList的< HashMap的<字符串,字符串>> categorySpinnerData;
上下文语境;
私人的ArrayList<布尔>检查=新的ArrayList<布尔>();
// ArrayList的<的ListObject>对象;
公共AdptCategories(ArrayList中< HashMap的<字符串,字符串>> _categorySpinnerData,上下文_context){
超();
上下文= _context;
categorySpinnerData = _categorySpinnerData;
}
@覆盖
公众诠释getCount将(){
返回categorySpinnerData.size();
}
@覆盖
公共对象的getItem(INT位置){
返回categorySpinnerData.get(位置);
}
@覆盖
众长getItemId(INT位置){
返回0;
}
静态类ViewHolderItem {
TextView的txtCategoryNameId;
静态复选框categoryChkBxId;
}
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
ViewHolderItem viewHolder;
HashMap的<字符串,字符串> mapData = categorySpinnerData.get(位置);
的for(int i = 0; I< this.getCount();我++)
{
checked.add(我,FALSE);
}
ViewHolderItem.categoryChkBxId.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton复选框,
布尔器isChecked){
// TODO自动生成方法存根
如果(器isChecked)
{
checked.set(位置,真正的);
}
其他
{
checked.set(位置,假);
}
}
});
ViewHolderItem.categoryChkBxId.setChecked(checked.get(位置));
如果(convertView == NULL){
LayoutInflater mInflater =(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.adpt_categories_spinner,NULL);
//以及建立ViewHolder
viewHolder =新ViewHolderItem();
viewHolder.txtCategoryNameId =(TextView中)convertView.findViewById(R.id.txtCategoryNameId);
viewHolder.categoryChkBxId =(复选框)convertView.findViewById(R.id.categoryChkBxId);
//存储与所述视图中的保持器。
convertView.setTag(viewHolder);
}其他{
//我们刚刚避免对资源的每一次调用findViewById()
//只使用viewHolder
viewHolder =(ViewHolderItem)convertView.getTag();
}
如果(位置== 0){
viewHolder.txtCategoryNameId.setText(mapData.get(名字));
viewHolder.categoryChkBxId.setVisibility(View.INVISIBLE);
}其他{
viewHolder.txtCategoryNameId.setText(mapData.get(名字));
viewHolder.txtCategoryNameId.setTag(mapData.get(ID));
viewHolder.categoryChkBxId.setVisibility(View.VISIBLE);
}
返回convertView;
}
}
这是由于意见在飞旋的循环,你所能做的就是声明一个布尔数组私人的ArrayList<布尔>检查=新的ArrayList<布尔>();
和初始化适配器构造
的for(int i = 0; I< this.getCount();我++)
{
checked.add(我,FALSE);
}
和现在的GET观点方法来使用它像这样: -
your_checkbox.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton复选框,
布尔器isChecked){
// TODO自动生成方法存根
如果(器isChecked)
{
checked.set(位置,真正的);
}
其他
{
checked.set(位置,假);
}
}
});
your_checkbox.setChecked(your_data.get(位置));
和取悦你的viewholder它是一个很好的做法。
What I have: I have a spinner, foe which I have set the adapter, the adapter displayed in coed below has a checkbox
and a textview
What is happening:: When I check the checkbox in one row and scroll below, some item in the below adapter is checked automatically. also when i scroll back up the adapter i checked also remained checked
What I am trying to do:: How can I preserve the proper selection of checkbox in the adapter all teh time. when i scroll up and down
AdptCategories.java
public class AdptCategories extends BaseAdapter {
ArrayList<HashMap<String, String>> categorySpinnerData;
Context context;
//ArrayList<ListObject> objects;
public AdptCategories(ArrayList<HashMap<String, String>> _categorySpinnerData, Context _context) {
super();
context=_context;
categorySpinnerData=_categorySpinnerData;
}
@Override
public int getCount() {
return categorySpinnerData.size();
}
@Override
public Object getItem(int position) {
return categorySpinnerData.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
HashMap<String, String> mapData=categorySpinnerData.get(position);
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.adpt_categories_spinner, null);
}
TextView txtCategoryNameId = (TextView) convertView.findViewById(R.id.txtCategoryNameId);
CheckBox categoryChkBxId = (CheckBox)convertView.findViewById(R.id.categoryChkBxId);
if(position==0){
txtCategoryNameId.setText(mapData.get("name"));
categoryChkBxId.setVisibility(View.INVISIBLE);
}else{
txtCategoryNameId.setText(mapData.get("name"));
txtCategoryNameId.setTag(mapData.get("id"));
categoryChkBxId.setVisibility(View.VISIBLE);
}
return convertView;
}
}
{EDIT}
public class AdptCategories extends BaseAdapter {
ArrayList<HashMap<String, String>> categorySpinnerData;
Context context;
private ArrayList<Boolean> checked = new ArrayList<Boolean>();
//ArrayList<ListObject> objects;
public AdptCategories(ArrayList<HashMap<String, String>> _categorySpinnerData, Context _context) {
super();
context=_context;
categorySpinnerData=_categorySpinnerData;
}
@Override
public int getCount() {
return categorySpinnerData.size();
}
@Override
public Object getItem(int position) {
return categorySpinnerData.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
static class ViewHolderItem {
TextView txtCategoryNameId;
static CheckBox categoryChkBxId;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolderItem viewHolder;
HashMap<String, String> mapData=categorySpinnerData.get(position);
for (int i = 0; i < this.getCount(); i++)
{
checked.add(i, false);
}
ViewHolderItem.categoryChkBxId.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton checkbox,
boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked)
{
checked.set(position,true);
}
else
{
checked.set(position,false);
}
}
});
ViewHolderItem.categoryChkBxId.setChecked(checked.get(position));
if(convertView==null){
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.adpt_categories_spinner, null);
// well set up the ViewHolder
viewHolder = new ViewHolderItem();
viewHolder.txtCategoryNameId = (TextView) convertView.findViewById(R.id.txtCategoryNameId);
viewHolder.categoryChkBxId = (CheckBox)convertView.findViewById(R.id.categoryChkBxId);
// store the holder with the view.
convertView.setTag(viewHolder);
}else{
// we've just avoided calling findViewById() on resource every time
// just use the viewHolder
viewHolder = (ViewHolderItem) convertView.getTag();
}
if(position==0){
viewHolder.txtCategoryNameId.setText(mapData.get("name"));
viewHolder.categoryChkBxId.setVisibility(View.INVISIBLE);
}else{
viewHolder.txtCategoryNameId.setText(mapData.get("name"));
viewHolder.txtCategoryNameId.setTag(mapData.get("id"));
viewHolder.categoryChkBxId.setVisibility(View.VISIBLE);
}
return convertView;
}
}
this is due to the recycling of views in spinner,what you can do is declare an boolean array private ArrayList<Boolean> checked = new ArrayList<Boolean>();
and initialize in your adapter constructor
for (int i = 0; i < this.getCount(); i++)
{
checked.add(i, false);
}
and now your get view method use it like this:-
your_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton checkbox,
boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked)
{
checked.set(position,true);
}
else
{
checked.set(position,false);
}
}
});
your_checkbox.setChecked(your_data.get(position));
and please your viewholder its a good practice.
这篇关于当我把它的滚动复选框微调适配器自动检查的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!