CheckedTextView从SimpleCursorAdapter加载默认值

时间:2011-11-18 01:06:11

标签: android android-listview simplecursoradapter checkedtextview android-viewbinder

我有一个使用CheckedTextView的适配器,并从SimpleCursorAdapter延伸。我试图加载CheckTextView的默认值,但我没有设法做到这一点。我不知道这是CheckedTextView的行为还是我做错了。

我尝试了什么?

我尝试覆盖getView()方法并获取CheckedTextView视图并使用setChecked(boolean),FAILED,奇怪的是它不起作用。

然后我尝试使用ViewBinder,但这也不起作用。

对此问题的任何见解?

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            public boolean setViewValue(View view, Cursor cursor,
                    int columnIndex) {
                CheckedTextView cb = (CheckedTextView) view;
                int checked=cursor.getInt(cursor.getColumnIndex(ProgramSurvey.CHECKED));
                cb.setChecked(checked==1);

                return false;
            }
        });

4 个答案:

答案 0 :(得分:4)

如果从getView返回的View是CheckedTextView(或任何其他实现Checkable的视图),那么listView将根据它认为选择的行(从调用setItemChecked)设置相关行的选中。您需要告诉ListView检查哪些行,而不是尝试自己设置它,或者将视图包装在一个不实现可检查的视图中,然后您就可以在CheckedTextView中自行设置检查。

答案 1 :(得分:2)

你可以试试这个:

listview.setItemChecked(position,true);

答案 2 :(得分:0)

它实际上帮助了来自@superfell的想法,但由于我的绑定器依赖于Cursor,我不得不重新查询ClickView甚至来自ListView,就像这样

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterlist, View view,
                    int pos, long id) {

                CheckedTextView checkBox = (CheckedTextView) view
                        .findViewById(R.id.checkTextProgram);
                CursorWrapper cursor = (CursorWrapper) adapterlist
                        .getItemAtPosition(pos);

                if (checkBox.isChecked()) {
                    String programId = cursor.getString(cursor
                            .getColumnIndex(Program._ID));
                    getActivity().getContentResolver().delete(
                            ProgramSurvey.buildUri(_ID),
                            ProgramSurvey.PROGRAM_ID + "=?",
                            new String[] { programId });
                } else {
                    ContentValues values = new ContentValues();
                    values.put(ProgramSurvey.PROGRAM_ID, cursor
                            .getString(cursor.getColumnIndex(Program._ID)));
                    values.put(ProgramSurvey.SURVEY_ID, _ID);
                    getActivity().getContentResolver().insert(
                            ProgramSurvey.CONTENT_URI, values);
                }

                getLoaderManager().restartLoader(0, null, ProgramDialogFragment.this);

            }

        });

所以我使用了loader manager来根据需要重新查询游标。

答案 3 :(得分:0)

我只是试图扩充布局(android.R.layout.simple_list_item_multiple_choice)...它只提供了修改后的复选框图像和textview颜色以及padding.It类似于checkedTextview。

适配器类:

public class CustomListAdapter extends BaseAdapter {

    private String[] stringArray;
    private Context mContext;
    private LayoutInflater inflator;
    int checkbox;
    /**
     * 
     * @param context
     * @param stringArray
     */
    public CustomListAdapter(Context  context, String[] stringArray) 
    {
        this.mContext=context;
        this.stringArray=stringArray;
        this.inflator= (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount()
    {
        return stringArray.length;
    }

    @Override
    public Object getItem(int position)
    {
        return position;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {

        final MainListHolder mHolder;
        View v = convertView;
        if (convertView == null)
        {
            mHolder = new MainListHolder();
            v = inflator.inflate(android.R.layout.simple_list_item_multiple_choice, null);
            mHolder.txt=(CheckedTextView) v.findViewById(android.R.id.text1);
            v.setTag(mHolder);
        } 
        else
        {
            mHolder = (MainListHolder) v.getTag();
        }
        mHolder.txt.setText(stringArray[position]);
        mHolder.txt.setTextSize(12);
        mHolder.txt.setTextColor(Color.YELLOW);

    /**
     * When checkbox image is set By setImageFromResourceCheckBox(int id) method...Otherwise it takes default
     */
        if(checkbox!=0)
            mHolder.txt.setCheckMarkDrawable(R.drawable.android_button);

        mHolder.txt.setPadding(5, 5, 5, 5);
        return v;
    }
    class MainListHolder 
    {
        private CheckedTextView txt;

    }
    /***
     * Setting Image for Checkbox
     * @param id
     * 
     */
    public void setImageFromResourceCheckBox(int id)
    {
        this.checkbox=id;
    }


}

主要活动:

public class CheckedListActivity extends ListActivity implements OnItemClickListener  {

    //final String[] str={"Android","Black Berry","Iphone","Ipad"};
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        CustomListAdapter c=new CustomListAdapter(this,GENRES);
        c.setImageFromResourceCheckBox(R.drawable.android_button);
        setListAdapter(c);

        final ListView listView = getListView();
        listView.setItemsCanFocus(false);
        //listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);// For single mOde

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        //used for default selection .....
        listView.setItemChecked(2, true);
        listView.setOnItemClickListener(this);
    }


    private static final String[] GENRES = new String[] 
                                                {
        "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
        "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
    };
    @Override
    public void onItemClick(AdapterView<?> adapter, View arg1, int arg2, long arg3)
    {

    SparseBooleanArray sp=getListView().getCheckedItemPositions();

    String str="";
    for(int i=0;i<sp.size();i++)
    {
        str+=GENRES[sp.keyAt(i)]+",";
    }
    Toast.makeText(this, ""+str, Toast.LENGTH_SHORT).show();

    }
}