返回android中复选框的选中状态

时间:2012-11-01 14:42:29

标签: android listview checkbox

  

可能重复:
  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;
    }
}

2 个答案:

答案 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);

            }
        }
    }