Список просмотра с проверенным текстом, повторяющий отмеченные элементы
Я реализовал ListView с пользовательским ArrayAdapter, где каждая строка состоит из виджета CheckedTextView. Когда я проверяю первый элемент ListView и прокручиваю вниз, я обнаруживаю, что другие элементы ListView также проверяются, и, когда я прокручиваю вниз, я нахожу проверенные элементы. Похоже, что первый дочерний элемент я проверяю несколько раз, как реплицируется на другой дочерний элемент списка, которые не видны
Я знаю, что у нас есть возможность использовать choiceMode, но это не работает с пользовательским ArrayAdapter, и я должен использовать пользовательский ArrayAdapter. Тип объекта String для ArrayAdapter. Я нашел в Интернете примеры пользовательских моделей для поддержки тега флажка, но, поскольку я использую String, я не могу этого сделать.
Я вставляю свой код адаптера:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolderClass viewHolder;
if(convertView==null)
{
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.disruption_routes_list_child, parent, false);
viewHolder = new ViewHolderClass();
initUI(convertView, viewHolder);
convertView.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolderClass) convertView.getTag();
}
viewHolder.ctvRoutes.setText(alRoutes.get(position));
viewHolder.ctvRoutes.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(viewHolder.ctvRoutes.isChecked())
{
viewHolder.ctvRoutes.setChecked(false);
}
else
{
viewHolder.ctvRoutes.setChecked(true);
}
}
});
return convertView;
}
private void initUI(View convertView, ViewHolderClass viewHolder) {
// TODO Auto-generated method stub
viewHolder.ctvRoutes = (CheckedTextView) convertView.findViewById(R.id.ctvRoutes);
}
static class ViewHolderClass
{
CheckedTextView ctvRoutes;
}
2 ответа
Вы должны сохранить состояние ViewHolder
, Затем установите tag
когда convertView == null
и получить его в else
состояние.
Проверьте, как я это сделал:
public class Conference_listViewAdapter extends ArrayAdapter<Model> {
Activity context;
LayoutInflater inflater;
public static List<Model> data = null;
ArrayList<String> id_list = new ArrayList<String>();
int pos;
public Conference_listViewAdapter(Activity context, List<Model> list, ArrayList<String> id_list) {
super(context, R.layout.people_list_item1, list);
this.context = context;
this.data = list;
this.id_list = id_list;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.people_list_item1, null);
final ViewHolder holder = new ViewHolder();
holder.title = (TextView) view.findViewById(R.id.tv_name);
holder.image = (ImageView) view.findViewById(R.id.avtaar);
holder.favorite = (CheckBox) view.findViewById(R.id.fav);
view.setTag(holder);
holder.favorite.setTag(data.get(position));
holder.favorite.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Model element = (Model) holder.favorite.getTag();
element.setSelected(buttonView.isChecked());
}
});
} else {
view = convertView;
((ViewHolder) view.getTag()).favorite.setTag(data.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.favorite.setChecked(data.get(position).isSelected());
holder.title.setText(data.get(position).getName());
try {
holder.image.setImageBitmap(openPhoto(Long.valueOf(id_list.get(position))));
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
static class ViewHolder {
protected TextView title;
protected CheckBox favorite;
ImageView image;
}
Это дуэт к тому, что список Android переработан
чтобы преодолеть это, либо у вас будет собственный объект для заполнения списка, в котором вы предоставите поле с именем, например, ischecked и внутри вашего getview()
вы делаете следующее
if(yourlist.get(Position).isChecked())
viewHolder.ctvRoutes.setChecked(true);
else
viewHolder.ctvRoutes.setChecked(false);
или вы бы предоставили arrayList из int
в котором ваш магазин проверил позиции и внутри вашего getview()
проверьте, существует ли позиция в вашем массиве, сделайте это проверенным, иначе не проверено
Мне нравится первый подход, так как вы хотите искать свой массив в основном потоке, особенно если ваш массив массив огромен, это приведет к задержке прокрутки