Android CheckedTextView从SimpleCursorAdapter加载默认值

Android CheckedTextView从SimpleCursorAdapter加载默认值,android,android-listview,simplecursoradapter,checkedtextview,android-viewbinder,Android,Android Listview,Simplecursoradapter,Checkedtextview,Android Viewbinder,我有一个适配器,它使用CheckedTextView并从SimpleCursorAdapter扩展而来。我试图加载CheckTextView的默认值,但没有成功。我不知道这是CheckedTextView的行为还是我做错了什么 我试过什么? 我试图覆盖getView()方法,获取CheckedTextView视图并使用setChecked(boolean),失败了,奇怪的是它不起作用 然后我尝试使用ViewBinder,但这也不起作用 对这个问题有什么见解吗 adapter.setViewBin

我有一个适配器,它使用
CheckedTextView
并从
SimpleCursorAdapter
扩展而来。我试图加载
CheckTextView
的默认值,但没有成功。我不知道这是
CheckedTextView
的行为还是我做错了什么

我试过什么?

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

然后我尝试使用
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;
            }
        });

如果从getView返回的视图是CheckedTextView(或实现Checkable的任何其他视图),则listView将根据它认为选中的行(从对setItemChecked的调用中)在相关行上设置checked。您需要告诉ListView哪些行被选中,而不是自己设置,或者将视图包装到一个不实现checkable的视图中,然后您就可以在CheckedTextView中自己设置checked了。

这实际上有助于@superfell的想法,但由于我的活页夹依赖于光标,我不得不从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);

            }

        });
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图适配器列表、视图、,
内部位置,长id){
CheckedTextView复选框=(CheckedTextView)视图
.findviewbyd(R.id.checkTextProgram);
游标包装器游标=(游标包装器)适配器列表
.getItemAtPosition(pos);
如果(checkBox.isChecked()){
String programId=cursor.getString(游标
.getColumnIndex(Program._ID));
getActivity().getContentResolver().delete(
ProgramSurvey.buildUri(_ID),
ProgramSurvey.PROGRAM_ID+“=?”,
新字符串[]{programId});
}否则{
ContentValues=新的ContentValues();
value.put(ProgramSurvey.PROGRAM_ID,光标
.getString(cursor.getColumnIndex(Program.u ID));
value.put(ProgramSurvey.SURVEY\u ID,\u ID);
getActivity().getContentResolver().insert(
ProgramSurvey.CONTENT_URI,值);
}
getLoaderManager().restartLoader(0,null,ProgramDialogFragment.this);
}
});

因此,我使用加载器管理器按需重新查询光标。

我只是尝试膨胀布局(android.R.layout.simple\u list\u item\u multiple\u Choose)…它提供简单修改的复选框图像、文本视图颜色和填充。它类似于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();

    }
}
主要活动:

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();

    }
}
公共类CheckedListActivity扩展ListActivity实现ListListener{
//最后一个字符串[]str={“安卓”、“黑莓”、“Iphone”、“Ipad”};
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
CustomListAdapter c=新的CustomListAdapter(此,类型);
c、 setImageFromResourceCheckBox(R.drawable.android_按钮);
setListAdapter(c);
最终ListView ListView=getListView();
setItemsCanFocus(false);
//listView.setChoiceMode(listView.CHOICE_MODE_SINGLE);//用于单一模式
listView.setChoiceMode(listView.CHOICE\u MODE\u MULTIPLE);
//用于默认选择。。。。。
setItemChecked(2,true);
setOnItemClickListener(this);
}
私有静态最终字符串[]类型=新字符串[]
{
“动作”、“冒险”、“动画”、“儿童”、“喜剧”、“纪录片”、“戏剧”,
“外国”、“历史”、“独立”、“浪漫”、“科幻”、“电视”、“惊悚片”
};
@凌驾
公共链接(AdapterView适配器、视图arg1、int arg2、long arg3)
{
SparseBooleanArray sp=getListView().GetCheckEditePositions();
字符串str=“”;
对于(int i=0;i您可以尝试以下方法:

listview.setItemChecked(position,true);

你能发布你的视图绑定代码示例吗?“将你的视图包装在一个不实现可检查的视图中”我尝试了这个,但当我尝试检查它们时,它不允许我这样做。。。