2017-02-14 1 views
0

Я сделал ListView с CheckBox, но при прокрутке ListView больше CheckBox это выбрать случайным образом и не имеет своей позиции. Пожалуйста, помогите мне. спасибо заранееЯ сделал ListView с флажком, но при прокрутке ListView больше флажок, это выбрать случайным образом и не имеет своей позиции

public override View GetView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     view = context.LayoutInflater.Inflate(Resource.Layout.row1, parent, false); 
    } 
    Data item = this[position]; 
    view.FindViewById<TextView>(Resource.Id.title).Text = item.nameview; 
    view.FindViewById<TextView>(Resource.Id.reporter).Text = item.EmailIdview; 
    checkbox = view.FindViewById<CheckBox>(Resource.Id.checkbox);   
    checkbox.Tag = item.nameview; 
    checkbox.SetOnCheckedChangeListener(new CheckedChangeListener(context, list, position)); 
    return view; 
} 

public class CheckedChangeListener : Java.Lang.Object, CompoundButton.IOnCheckedChangeListener { 

    private Activity context; 
    private List<Data> list; 
    private int mPosition; 

    public CheckedChangeListener(Activity context, List<Data> list, int mPosition) { 
     this.context = context; 
     this.list = list; 
     this.mPosition = mPosition; 
    } 

    public void OnCheckedChanged(CompoundButton buttonView, bool isChecked) { 
     Group gr = new Group();     
     string name = buttonView.Tag.ToString(); 
     if (isChecked) { 
      gr.checkboxSelected(name, isChecked);//list.ElementAt(mPosition)      
     } else {     
      gr.setPosition(mPosition);      
     } 
    }   
} 
+0

принять держатель класс – user3040153

ответ

0

Вы можете использовать класс модели, чтобы удержать установленное состояние флажка. Как я могу видеть йо есть класс модели под названием данных

вы можете добавить IsChecked в данных класса модели, как это,

public class Data { 

    String name; 
    boolean isChecked; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public boolean isChecked() { 
     return isChecked; 
    } 

    public void setChecked(boolean checked) { 
     isChecked = checked; 
    } 
} 

Теперь у вас есть какое-то класс адаптера: использования держатель просмотра шаблон

вы можете установить тег для флажка. Я могу привести пример ссылки для этого, следуя тому же, вы получите желаемый результат.

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.TextView; 

import java.util.List; 

public class DataAdapter extends BaseAdapter { 


    public Activity context; 

    public List<Data> list; 

    public DataAdapter(Activity context, List<Data> list) { 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return list.get(i); 
    } 

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

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) { 
     Holder holder; 
     if (view == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      view = inflater.inflate(R.layout.list_row, viewGroup, false); 
      holder = new Holder(); 
      holder.textView = (TextView) view.findViewById(R.id.textView); 
      holder.checkBox = (CheckBox) view.findViewById(R.id.checkbox); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 
     } 
     holder.checkBox.setOnCheckedChangeListener(new CheckedChangeListener()); 
     holder.checkBox.setTag(position);//important line 
     holder.textView.setText(list.get(position).getName()); 
     holder.checkBox.setChecked(list.get(position).isChecked()); 
     return view; 
    } 

    private class CheckedChangeListener implements CompoundButton.OnCheckedChangeListener { 

     public CheckedChangeListener() { 
     } 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      int position=(int) compoundButton.getTag();//important line 
      list.get(position).setChecked(b);//important line 
     } 
    } 

    public static class Holder { 
     TextView textView; 
     CheckBox checkBox; 
    } 
} 

Дня кодирование ;)

+0

Спасибо, что он работает отлично. – priyanka

0

Override это два метода внутри вашего адаптера:

@Override 
    public int getViewTypeCount() { 

     return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

     return position; 
    } 

Надеется, что это решит проблему.

Cheers!

0

Их может быть нет. причин этой проблемы.

Ваш адаптер не знает, сколько типов видов принадлежит их списку. Для этого вы можете включить эти две функции в свой адаптер.

@Override public int getViewTypeCount() { return 1; } 

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

Другой причиной может быть то, что вы обновляете что-то в списке, но не обновляет его в базе данных (модель) вы скачали его from.On прокручивание вид списка потеряет информацию об элементах прокручивается далеко от screen.It будет загружать их снова из базы данных, которую вы ему предоставили. Поэтому эта база данных должна иметь обновленную информацию. проверьте эту ссылку.

Не используйте еще все для использования в адаптере: столько, сколько условий, которые вы используете в адаптере, всегда даете ему другое, чтобы адаптер знал, что делать. Иногда это является причиной смешения элементов адаптера.

Не использовать шаблон для зрителя: это также хорошо известная причина для этой проблемы. Вы должны использовать шаблон зрителя, который гарантирует, что адаптер не будет рисовать макет снова и снова.

0

Это из-за механизм повторного использования Просмотреть элемент управления ListView в. Вы можете изменить свой исходный код Data, как один из ответили, или вы можете добавить поле List к вашему адаптеру, чтобы сохранить состояние проверки каждого элемента и восстановить, когда отображается относительный элемент.

Смежные вопросы