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

标签 android listview checkbox

<分区>

Possible Duplicate:
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;
    }
}

最佳答案

您是否在 View 内容更改后触发代码来刷新 ListView ?有时您必须这样做,否则谁知道 ListView 会做什么。有很多命令可以执行此操作,例如 invalidateViews()。让 getView 中的 View 自身失效也可能有效

代码肯定可以使用优化,但那是另一个话题

关于android - 返回android中复选框的选中状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13179449/

相关文章:

asp.net - 无法确定 GridView 中复选框的状态

javascript - 取消选中 radio 场

android - 如何让当前 fragment 显示在 viewpager 的特定选项卡中?

python - 如何从 Android 应用程序与 Android 脚本环境进行交互?

java - 配置混淆器以排除扩展 android.content.Context 的库 jar

android - 在光标适配器中使用单击事件

java - ListView 问题

Android Studio Gradle 构建风格

Android忽略滚动条大小

c# - 使用变量控制 C# 复选框