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