2

重複の可能性:
Android は、カーソル アダプターを使用して ListView にチェックボックスの状態を保存します。

各項目に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;
    }
}
4

2 に答える 2

1

ビューのコンテンツが変更された後にリストビューを更新するためのコードを実行していますか?あなたは時々それをしなければなりません、さもなければListViewは誰が何を知っているかをします。これを行うことができるinvalidateViews()のようなコマンドがたくさんあります。getViewのビュー自体を無効にすることも機能する可能性があります

コードは間違いなく最適化を使用できますが、それは別のトピックです

于 2012-11-01T14:51:13.910 に答える
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);

            }
        }
    }
于 2012-11-01T20:13:54.990 に答える