我有自定义ListView。我正在使用数组适配器来填充我的ListViews行。它工作得很好。当我选择ListView行时,我的checkedtextview变得可见。滚动我检查的情况后消失。 我怎么能记得我的支票?
谢谢你的帮助。
我的适配器
package test.cbsmobil.ibb;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.TextView;
import java.util.ArrayList;
public class ListViewItemsAdapter extends ArrayAdapter<Item> {
private Context context;
private ArrayList<Item> items;
private LayoutInflater vi;
private int resLayout;
private CheckedTextView ctv;
private int selectedIndex;
public ListViewItemsAdapter(Context context, ArrayList<Item> items) {
super(context, 0, items);
this.context = context;
this.items = items;
vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
selectedIndex = -1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = items.get(position);
if (i != null) {
if (i.isSection()) {
ListViewItemsSection si = (ListViewItemsSection) i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
} else {
ListViewItems ei = (ListViewItems) i;
v = vi.inflate(R.layout.list_item_entry,null);
final TextView title = (TextView) v.findViewById(R.id.list_item_entry_title);
if (title != null)
title.setText(ei.title);
}
}
return v;
}
}
这是我的MainActivity; 让我解释一下这个活动的代码块。 layerlist是我的ListView。我在ListView中使用选择模式倍数进行多项选择。
layerlist.setAdapter(adapter);
layerlist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
layerlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(!items.get(position).isSection()){
ListViewItems item = (ListViewItems) items.get(position);
//adapter.setSelectedIndex(position);
Log.d("ListView", "Position " + item.toString());
//View v = layerlist.getChildAt(position);
View v = getViewByPosition(position,layerlist);
CheckedTextView ctv = (CheckedTextView) v.findViewById(R.id.ctv);
if (!ctv.isChecked()) {
ctv.setChecked(true);
Log.d("Checked", "Açıldı" + " " + ctv.isChecked());
} else {
ctv.setChecked(false);
Log.d("Checked", "Kapandı" + " " + ctv.isChecked());
}
}
}
});
return rootView;
}
private View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
答案 0 :(得分:1)
您应该使用&#34;视图持有者&#34; developer.android.com描述的设计模式,并详细解释了this post。
最重要的是:
这是我的适配器代码:
package br.com.inovant.pm;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import java.util.List;
public class ContactsAdapter extends ArrayAdapter<CheckedContact>{
public ContactsAdapter(Context context, List<CheckedContact> contacts) {
super(context, 0, contacts);
}
static class ViewHolder {
protected CheckedTextView checkedTextView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.select_dialog_multichoice, parent, false);
viewHolder = new ViewHolder();
viewHolder.checkedTextView = (CheckedTextView) convertView.findViewById(android.R.id.text1);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final CheckedContact checkedContact = getItem(position);
final CheckedTextView checkedTextView = viewHolder.checkedTextView;
checkedTextView.setText(checkedContact.getContact().getDisplayName());
checkedTextView.setChecked(checkedContact.isChecked());
return convertView;
}
@Override
public long getItemId(int position) {
return getItem(position).getContact().getId().hashCode();
}
@Override
public boolean hasStableIds() {
return true;
}
}
答案 1 :(得分:0)
我遇到了同样的问题,我在自定义适配器中使用了以下方法,我得到了解决方案。
在ListViewItemsAdapter中添加以下方法:
@Override
public int getCount() {
return alUpgradeTour.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return getCount();
}
尝试一下,你也会得到解决方案。
答案 2 :(得分:0)
Android的ListView会回收其所有单独的视图,也就是说,当列表项滚动离开屏幕时,其视图将被回收以供刚刚滚动到可见屏幕区域的视图使用。现在,当一个旧的列表项滚动回到视图中时,它会获得一些其他回收视图来绘制自己。 因此,复选标记丢失或任何已更改/更新的数据。
对此的解决方案是将更改保存在列表项中,在您的情况下 - ListViewItems。假设您在ListViewItems的类定义中有一个标志boolean isChecked = false
,并且在您调用setChecked方法的onItemClick中,设置isChecked = true
这将有助于您坚持使用复选标记。
希望它有所帮助。