可能重复:
Android save Checkbox State in ListView with Cursor Adapter
我有ListView
,其中每个项目都包含一些text(name,id)
和一个复选框。有一个按钮可以从ListView
页面返回。因此,用户检查一些项目并返回上一页。此页面还有一个按钮可以返回ListView
页面。当他/她回来时,我想向他/她展示他/她之前选择的项目。
我知道SharedPreferences
,但我不想使用它,因为当用户重新启动应用程序时我不想保存该状态。我只想在应用程序运行时使用它。我做了一些工作,保存他选择的数据,并在他回来时检查。但我无法检查复选框。我希望有人会说我在这里做错了什么。我使用xml中的复选框,而不是以编程方式。
public class MyCustomArrayAdapter extends ArrayAdapter<Model> {
private final List<Model> list;
private final Activity context;
public static ArrayList<String> friendName=new ArrayList<String>();
public static ArrayList<String> friendBirthdate=new ArrayList<String>();
public static ArrayList<String> friendId=new ArrayList<String>();
public static ArrayList<String> getSelectedFriendId;
public MyCustomArrayAdapter(Activity context, List<Model> list)
{
super(context, R.layout.list_layout, list);
this.context = context;
this.list = list ;
}
public static int count=0;
static class ViewHolder
{
protected TextView text, sub;
protected CheckBox checkbox;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = null;
if (convertView ==null)
{
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.list_layout, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView)view.findViewById(R.id.label);
viewHolder.text.setTextColor(Color.WHITE);
viewHolder.sub = (TextView)view.findViewById(R.id.sub);
viewHolder.sub.setTextColor(Color.GRAY);
viewHolder.checkbox = (CheckBox)view.findViewById(R.id.check);
if(SelectionPage.get_selectedFriendId()!=null) //checking whether user checked something earlier
{
getSelectedFriendId=SelectionPage.get_selectedFriendId(); //get checked userid from when user selects something
for( int x = 0 ; x < getSelectedFriendId.size() ; x++ )
{
for(int a=0;a<list.size();a++)
{
if(list.get(a).getId().contains(getSelectedFriendId.get(x)))
{
Toast.makeText( context, "matched..", Toast.LENGTH_SHORT).show();
viewHolder.checkbox.setChecked(true); //this doesn't check checkbox which is the problem!
}
}
}
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
Model element = (Model)viewHolder.checkbox.getTag();
if(buttonView.isChecked())
{
count++;
friendName.add(element.getName().toString());
friendBirthdate.add(element.getPlace().toString());
friendId.add(element.getId().toString());
}
else
{
friendName.remove(element.getName().toString());
friendBirthdate.remove(element.getPlace().toString());
friendId.remove(element.getId().toString());
count--;
}
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
}
else
{
view = convertView;
((ViewHolder)view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
holder.sub.setText( list.get(position).getPlace());
return view;
}
}
答案 0 :(得分:1)
在视图内容发生变化后,您是否在解密代码以刷新列表视图?你有时必须这样做,否则ListView会知道谁知道什么。有一些像invalidateViews()这样的命令可以做到这一点。让getView中的视图无效也可能有效
代码肯定可以使用优化,但那是另一个主题
答案 1 :(得分:1)
感谢大家的回复。我在玩了2个小时后得到了自己的答案。我在检查之前选择了哪个项目时进行了一些更改。为了那些面临同样问题的人,请给我下面的更新代码。
if(SelectionPage.get_selectedFriendId()!=null)
{
String s=list.get(position).getId().toString();
getSelectedFriendId=SelectionPage.get_selectedFriendId();
for( int x = 0 ; x < getSelectedFriendId.size() ; x++ )
{
if(s.contains(getSelectedFriendId.get(x)))
{
Toast.makeText( context, "matched!..", Toast.LENGTH_SHORT).show();
holder.checkbox.setChecked(true);
}
}
}