CheckedTextView загрузить значения по умолчанию из SimpleCursorAdapter
У меня есть адаптер, который использует 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;
}
});
4 ответа
Если представление, возвращаемое из getView, является CheckedTextView (или любым другим представлением, которое реализует Checkable), то listView установит флажок для соответствующих строк, основываясь на том, какие строки он считает выбранными (из обращений к setItemChecked). Вам нужно будет указать ListView, какие строки проверяются, вместо того, чтобы пытаться установить его самостоятельно, или, в качестве альтернативы, обернуть свое представление в представление, которое не реализует checkable, тогда вы сможете самостоятельно установить флажок в CheckedTextView.
Вы можете попробовать это:
listview.setItemChecked(position,true);
Я только что попытался раздуть макет (android.R.layout.simple_list_item_multiple_choice)... Он дает просто измененные изображения-флажки, а также цвета и отступы просмотра текста. Это похоже на 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();
}
}
Это на самом деле помогло идее от @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);
}
});
Поэтому я использовал менеджер загрузчика для запроса курсора по требованию.