问题ViewHolder选择 [英] Issue with ViewHolder selection
问题描述
我的工作在一个应用程序中,我处理的ListView
这是复合材料与 ViewHolder
。在这种 ViewHolder
,我有一个复选框
。这是我的code:
私有类SettingsArrayAdapter扩展ArrayAdapter<对象> {
上下文语境;
ArrayList的<对象>值;
RowSettingsViewHolder VH =无效;
BigRowSettingsViewHolder BVH = NULL;
@覆盖
公众诠释getItemViewType(INT位置){
如果(values.get(位置)的instanceof RowContent){
返回SMALL_ROW_DESIGN;
} 其他
返回BIG_ROW_DESIGN;
//返回super.getItemViewType(位置);
}
@覆盖
公众诠释getViewTypeCount(){
返回2;
}
公共SettingsArrayAdapter(上下文的背景下,ArrayList的<对象>的值){
超(背景下,R.layout.row_settings,价值观);
this.context =背景;
this.values =值;
}
//禁用选择在标题行
@覆盖
公共布尔的IsEnabled(INT位置){
返程(位置== 2 ||位== 4 ||位置== 8 ||位置== 9 ||位置== 13)?假:真的;
}
公共查看getView(INT位置,查看convertView,ViewGroup中父){
VH =无效;
BVH = NULL;
字符串的共享prefKey;
// Log.i(VH,VH标签:+ vh.toString());
整型= getItemViewType(位置);
//大排排除
如果(类型== SMALL_ROW_DESIGN){
如果(convertView == NULL){
LayoutInflater充气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings,父母,假);
VH =新RowSettingsViewHolder();
vh.titleTV =(TextView中)convertView.findViewById(R.id.settings_row_title);
vh.subtitleTV =(TextView中)convertView.findViewById(R.id.settings_row_subtitle);
vh.disclosureIV =(ImageView的)convertView.findViewById(R.id.settings_disclosureIV);
vh.checkCB =(复选框)convertView.findViewById(R.id.settings_cB);
vh.separatorLine =(查看)convertView.findViewById(R.id.settings_listView_separatorLine);
INT ID = Resources.getSystem()则getIdentifier(btn_check_holo_light,绘制,机器人)。
如果(ID!= 0)
vh.checkCB.setButtonDrawable(ID);
字样TF = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Light.otf);
vh.titleTV.setTypeface(TF);
convertView.setTag(VH);
Log.i(VH,VH标签:+ vh.toString());
} 其他 {
VH =(RowSettingsViewHolder)convertView.getTag();
vh.checkCB.setOnCheckedChangeListener(空);
}
vh.checkCB.setFocusable(假);
RowContent thisSetting = NULL;
thisSetting =(RowContent)values.get(位置);
鉴于//设置行值
vh.titleTV.setText(thisSetting.getTitle());
vh.disclosureIV.setImageDrawable(thisSetting.getDisclosureDrawable());
// 字幕
vh.subtitleTV.setText(thisSetting.getSubtitle());
。字符串title = vh.titleTV.getText()的toString();
。字符串字幕= vh.subtitleTV.getText()的toString();
如果(subtitle.equals(通知)|| subtitle.equals(MUSIC)|| subtitle.equals(电子邮件)|| subtitle.equals(SYSTEM)){
字样tfSubt = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Bold.otf);
vh.subtitleTV.setTypeface(tfSubt);
vh.separatorLine.setBackgroundColor(Color.BLACK);
} 其他 {
字样TF = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Light.otf);
vh.subtitleTV.setTypeface(TF);
vh.separatorLine.setBackgroundColor(Color.LTGRAY);
}
//复选框
如果(!thisSetting.needsCheckBox()){
vh.checkCB.setVisibility(View.INVISIBLE);
vh.checkCB.setOnClickListener(空);
} 其他 {
vh.checkCB.setVisibility(View.VISIBLE);
如果(title.equals(getResources()。的getString(R.string.Spotify))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isSpotifyActive());
共享prefKey =共享prefsHandler.spotifyKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.Google_Play))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isGooglePlayerActive());
共享prefKey =共享prefsHandler.googlePlayerKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.default_music_player))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isDefaultPlayerActive());
共享prefKey =共享prefsHandler.defaulPlayerKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.default_mail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isDefaultEmailAppActive());
共享prefKey =共享prefsHandler.defaultEmailKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.Hotmail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isHotmailActive());
共享prefKey =共享prefsHandler.hotmailKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.Gmail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isGmailActive());
共享prefKey =共享prefsHandler.gmailKey;
vh.checkCB.setTag(共享prefKey);
}否则,如果(title.equals(getResources()的getString(R.string.enable_disable_all_notif))){
vh.checkCB.setChecked(共享preferencesHandler_settings.areAllNotifsActive());
共享prefKey =共享prefsHandler.allNotifsActiveKey;
vh.checkCB.setTag(共享prefKey);
}
vh.checkCB.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
// TODO自动生成方法存根
// Log.i(TabSettingsActivity,检查);
Log.i(VH-2,VH标签:+ vh.toString());
共享preferencesHandler_settings.setSettingActive(共享prefsHandler.allNotifsActiveKey,vh.checkCB.isChecked());
Log.i(TabSettingsActivity,检查+ Boolean.toString(器isChecked));
// Log.i(器isChecked,vh.checkCB.getTag()的toString());
Log.i(TabSettingsActivity,VH的标签:+ vh.checkCB.getTag()的toString());
共享preferencesHandler_settings.setSettingActive(vh.checkCB.getTag()的toString(),器isChecked。);
//做的东西在这里。
Log.i(VH-ID,VH标签:+ vh.toString());
}
});
}
}
//大排
其他 {
如果(convertView == NULL){
LayoutInflater充气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings_big,父母,假);
BVH =新BigRowSettingsViewHolder(convertView);
convertView.setTag(BVH);
}
其他 {
BVH =(BigRowSettingsViewHolder)convertView.getTag();
}
bvh.setRowData();
}
返回convertView;
}
}
我在做什么是存储在共享preferences
的 ViewHolder
项值。当我把抽动任何复选框
似乎一切正常,但如果我用的是卷轴,蜱消失了,然后我一直在调查,我做了下一个:
我把这个行:
Log.i(VH-ID,VH的标签:+ vh.toString());
在它创建ViewHolder,这样我可以得到每个 ViewHolder
的ID,我也加入了同一行上面的监听方法里面:
vh.checkCB.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
// TODO自动生成方法存根
// Log.i(TabSettingsActivity,检查);
Log.i(VH-2,VH标签:+ vh.toString());
共享preferencesHandler_settings.setSettingActive(共享prefsHandler.allNotifsActiveKey,vh.checkCB.isChecked());
Log.i(TabSettingsActivity,检查+ Boolean.toString(器isChecked));
// Log.i(器isChecked,vh.checkCB.getTag()的toString());
Log.i(TabSettingsActivity,VH的标签:+ vh.checkCB.getTag()的toString());
共享preferencesHandler_settings.setSettingActive(vh.checkCB.getTag()的toString(),器isChecked。);
//做的东西在这里。
Log.i(VH-ID,VH标签:+ vh.toString());
}
});
的事情是,例如应用程序启动时我可以看到所有的 ViewHolder
的ID,但是当我在任何人检查我易拉罐怎么看的ID都不同,所以它走的是一条不同的 ViewHolder
是我检查过了,我没有想法,为什么采取不同的ID(ViewHolder <$ C C $> )。
我做了这苏菲安告诉我的变化,这是code,即使是这样,现在我得到了不幸的是......
公开查看getView(INT位置,查看convertView,ViewGroup中父){
VH =无效;
BVH = NULL;
字符串的共享prefKey;
整型= getItemViewType(位置);
//大排排除
如果(类型== SMALL_ROW_DESIGN){
如果(convertView == NULL || convertView.getTag()== NULL){
LayoutInflater充气=(LayoutInflater)上下文
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings,父母,假);
VH =新RowSettingsViewHolder();
vh.titleTV =(TextView中)convertView.findViewById(R.id.settings_row_title);
vh.subtitleTV =(TextView中)convertView.findViewById(R.id.settings_row_subtitle);
vh.disclosureIV =(ImageView的)convertView.findViewById(R.id.settings_disclosureIV);
vh.checkCB =(复选框)convertView.findViewById(R.id.settings_cB);
vh.separatorLine =(查看)convertView.findViewById(R.id.settings_listView_separatorLine);
INT ID = Resources.getSystem()则getIdentifier(btn_check_holo_light,绘制,机器人)。
如果(ID!= 0)
vh.checkCB.setButtonDrawable(ID);
字样TF = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Light.otf);
vh.titleTV.setTypeface(TF);
vh.checkCB.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
// TODO自动生成方法存根
//Log.i("TabSettingsActivity,检查);
共享preferencesHandler_settings.setSettingActive(共享prefsHandler.allNotifsActiveKey,vh.checkCB.isChecked());
Log.i(TabSettingsActivity,检查+ Boolean.toString(器isChecked));
。//Log.i("isChecked,vh.checkCB.getTag()的toString());
Log.i(TabSettingsActivity,VH的标签:+ vh.checkCB.getTag()的toString());
共享preferencesHandler_settings.setSettingActive(vh.checkCB.getTag()的toString(),器isChecked。);
//做的东西在这里。
}
});
convertView.setTag(VH);
Log.i(VH,VH+ vh.toString());
Log.i(位置,位置+位置);
如果需要的话//初始化sahred preFS
/ *如果(共享prefsHandler == NULL){
。共享prefsHandler.getInstance()initForNotifications(getActivity());
共享prefsHandler =共享prefsHandler.getInstance();
} * /
}
其他{
VH =(RowSettingsViewHolder)convertView.getTag();
vh.checkCB.setTag(位置);
vh.checkCB.setChecked(vh.checkCB.isChecked());
}
RowContent thisSetting = NULL;
thisSetting =(RowContent)values.get(位置);
鉴于//设置行值
vh.titleTV.setText(thisSetting.getTitle());
vh.disclosureIV.setImageDrawable(thisSetting.getDisclosureDrawable());
// 字幕
vh.subtitleTV.setText(thisSetting.getSubtitle());
。字符串title = vh.titleTV.getText()的toString();
。字符串字幕= vh.subtitleTV.getText()的toString();
如果(subtitle.equals(通知)|| subtitle.equals(MUSIC)|| subtitle.equals(电子邮件)|| subtitle.equals(SYSTEM)){
字样tfSubt = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Bold.otf);
vh.subtitleTV.setTypeface(tfSubt);
vh.separatorLine.setBackgroundColor(Color.BLACK);
}
其他{
字样TF = Typeface.createFromAsset(getActivity()getAssets(),字体/ Decima的Light.otf);
vh.subtitleTV.setTypeface(TF);
vh.separatorLine.setBackgroundColor(Color.LTGRAY);
}
//复选框
如果(!thisSetting.needsCheckBox()){
vh.checkCB.setVisibility(View.INVISIBLE);
vh.checkCB.setOnClickListener(空);
}
其他{
vh.checkCB.setVisibility(View.VISIBLE);
如果(title.equals(getResources()。的getString(R.string.Spotify))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isSpotifyActive());
共享prefKey =共享prefsHandler.spotifyKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.Google_Play))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isGooglePlayerActive());
共享prefKey =共享prefsHandler.googlePlayerKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.default_music_player))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isDefaultPlayerActive());
共享prefKey =共享prefsHandler.defaulPlayerKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.default_mail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isDefaultEmailAppActive());
共享prefKey =共享prefsHandler.defaultEmailKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.Hotmail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isHotmailActive());
共享prefKey =共享prefsHandler.hotmailKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.Gmail))){
vh.checkCB.setChecked(共享preferencesHandler_settings.isGmailActive());
共享prefKey =共享prefsHandler.gmailKey;
vh.checkCB.setTag(共享prefKey);
}
否则,如果(title.equals(getResources()的getString(R.string.enable_disable_all_notif))){
vh.checkCB.setChecked(共享preferencesHandler_settings.areAllNotifsActive());
共享prefKey =共享prefsHandler.allNotifsActiveKey;
vh.checkCB.setTag(共享prefKey);
}
/ * vh.checkCB.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
Log.i(TabSettingsActivity,检查);
共享preferencesHandler_settings.setSettingActive(共享prefsHandler.allNotifsActiveKey,vh.checkCB.isChecked());
Log.i(器isChecked,通过Boolean.valueOf(vh.checkCB.isChecked())的toString());
Log.i(器isChecked,vh.checkCB.getTag()的toString());
共享preferencesHandler_settings.setSettingActive(vh.checkCB.getTag()的toString(),vh.checkCB.isChecked());
//做的东西在这里。
}
}); * /
}
}
//大排
其他 {
如果(convertView == NULL){
LayoutInflater充气=(LayoutInflater)上下文
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings_big,父母,假);
BVH =新BigRowSettingsViewHolder(convertView);
convertView.setTag(BVH);
}
其他{
BVH =(BigRowSettingsViewHolder)convertView.getTag();
}
bvh.setRowData();
}
返回convertView;
}
}
我希望这可以帮助解决这个问题。
下面是LogCat中:
11-25 13:19:48.671:D / dalvikvm(24077):GC_FOR_ALLOC释放81K,2%自由9068K / 9180K,暂停为15ms,15ms的总
11-25 13:19:48.671:I / dalvikvm堆(24077):成长堆(破片的情况下),以9.687MB为842416字节分配
11-25 13:19:48.681:D / dalvikvm(24077):GC_FOR_ALLOC释放&LT; 1K,免费9890K / 10004K 2%,暂停10毫秒,10毫秒总
11-25 13:19:48.751:D / dalvikvm(24077):GC_FOR_ALLOC释放24K,免费10214K / 10272K 1%,暂停11毫秒,11毫秒总
11-25 13:19:48.761:I / dalvikvm堆(24077):成长堆(破片的情况下),以17.913MB为8294416字节分配
11-25 13:19:48.781:D / dalvikvm(24077):GC_FOR_ALLOC释放1K,免费18312K / 18376K,暂停12毫秒,12毫秒总数1%
11-25 13:19:48.872:W / dalvikvm(24077):无法解析LCOM / ionglasses2 / BLE / DfuService的父类; (1377)
11-25 13:19:48.872:W / dalvikvm(24077):类的链接LCOM / ionglasses2 / BLE / DfuService;失败
11-25 13:19:48.872:E / dalvikvm(24077):找不到类的com.ionglasses2.ble.DfuService,从法com.ionglasses2.ble.DiscoveryService.startDFUService引用
11-25 13:19:48.872:W / dalvikvm(24077):VFY:无法解析常量级1240(LCOM / ionglasses2 / BLE / DfuService;)在LCOM / ionglasses2 / BLE /获得DiscoveryService;
11-25 13:19:48.872:D / dalvikvm(24077):VFY:在0x000c更换运code为0x1C
11-25 13:19:48.882:I / TabNotificationsActivity(24077):获得视图EventosArrayAdapter
11-25 13:19:48.892:I /共享prefsHandler(24077):某个getInstance
11-25 13:19:48.902:I /共享prefsHandler(24077):initForNotifications
11-25 13:19:48.902:I /共享prefsHandler(24077):某个getInstance
11-25 13:19:48.902:I /共享prefsHandler(24077):事件:呼叫getIsEventActive:假的
11-25 13:19:49.002:D / dalvikvm(24077):GC_FOR_ALLOC释放425K,免费20304K / 20760K,暂停13毫秒,13毫秒总额3%
11-25 13:19:49.022:I /肾上腺EGL(24077):其中,qeglDrvAPI_eglInitialize:320计算值:EGL 1.4高通公司体形:I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate:13年11月6日
11-25 13:19:49.052:D / OpenGLRenderer(24077):启用调试模式0
11-25 13:19:49.052:I / TabNotificationsActivity(24077):获得视图EventosArrayAdapter
11-25 13:19:49.062:I /共享prefsHandler(24077):事件:呼叫getIsEventActive:假的
11-25 13:19:49.072:I / TabNotificationsActivity(24077):获得视图EventosArrayAdapter
11-25 13:19:49.072:I /共享prefsHandler(24077):事件:短信getIsEventActive:假的
11-25 13:19:49.082:I / TabNotificationsActivity(24077):获得视图EventosArrayAdapter
11-25 13:19:49.082:I /共享prefsHandler(24077):事件:EMAIL getIsEventActive:假的
11-25 13:19:49.082:I / TabNotificationsActivity(24077):获得视图EventosArrayAdapter
11-25 13:19:49.092:I /共享prefsHandler(24077):事件:TWITTER getIsEventActive:假的
11-25 13:19:52.175:I /共享prefsHandler(24077):某个getInstance
11-25 13:19:52.185:I /共享prefsHandler(24077):initForSettings
11-25 13:19:52.185:I /共享prefsHandler(24077):某个getInstance
11-25 13:19:52.185:I / TabSettings(24077):mState:0
11-25 13:19:52.185:E / TabSettingsActivity(24077):onResume:RegistermGattUpdateReceiver
11-25 13:19:52.205:I / VH(24077):VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c22fa8
11-25 13:19:52.205:I /位置(24077):位置0
11-25 13:19:52.225:I / VH(24077):VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c27b78
11-25 13:19:52.225:I /位置(24077):第1位
11-25 13:19:52.235:I / VH(24077):VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c2bda0
11-25 13:19:52.235:I /位置(24077):位置2
11-25 13:19:52.245:I / VH(24077):VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c2fff0
11-25 13:19:52.245:I /位置(24077):第3位
11-25 13:19:52.245:I /共享preFS(24077):信息leida是所有notif活动:真
11-25 13:19:52.245:I /共享preFS(24077):allNotifsActive值:真
11-25 13:19:52.245:I / TabSettingsActivity(24077):检查:真
11-25 13:19:52.245:D / AndroidRuntime(24077):关闭虚拟机
11-25 13:19:52.245:W / dalvikvm(24077):主题ID = 1:螺纹退出与未捕获的异常(组= 0x41615ba8)
11-25 13:19:52.255:E / AndroidRuntime(24077):致命异常:主要
11-25 13:19:52.255:E / AndroidRuntime(24077):工艺:com.ionglasses2,PID:24077
11-25 13:19:52.255:E / AndroidRuntime(24077):显示java.lang.NullPointerException
11-25 13:19:52.255:E / AndroidRuntime(24077):在com.ionglasses2.TabSettingsActivity$SettingsArrayAdapter$1.onCheckedChanged(TabSettingsActivity.java:1341)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.CompoundButton.setChecked(CompoundButton.java:127)
11-25 13:19:52.255:E / AndroidRuntime(24077):在com.ionglasses2.TabSettingsActivity $ SettingsArrayAdapter.getView(TabSettingsActivity.java:1430)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.AbsListView.obtainView(AbsListView.java:2263)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.ListView.makeAndAddView(ListView.java:1790)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.ListView.fillDown(ListView.java:691)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.ListView.fillFromTop(ListView.java:752)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.ListView.layoutChildren(ListView.java:1630)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.AbsListView.onLayout(AbsListView.java:2091)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.View.layout(View.java:14817)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5670)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.Choreographer.doCallbacks(Choreographer.java:574)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.Choreographer.doFrame(Choreographer.java:544)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.os.Handler.handleCallback(Handler.java:733)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.os.Handler.dispatchMessage(Handler.java:95)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.os.Looper.loop(Looper.java:136)
11-25 13:19:52.255:E / AndroidRuntime(24077):在android.app.ActivityThread.main(ActivityThread.java:5017)
11-25 13:19:52.255:E / AndroidRuntime(24077):在java.lang.reflect.Method.invokeNative(本机方法)
11-25 13:19:52.255:E / AndroidRuntime(24077):在java.lang.reflect.Method.invoke(Method.java:515)
11-25 13:19:52.255:E / AndroidRuntime(24077):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
11-25 13:19:52.255:E / AndroidRuntime(24077):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
11-25 13:19:52.255:E / AndroidRuntime(24077):在dalvik.system.NativeStart.main(本机方法)
最后,我解决了这个问题,这是code:
`vh.checkCB.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
// TODO自动生成方法存根
//Log.i("TabSettingsActivity,检查);
//共享preferencesHandler_settings.setSettingActive(共享prefsHandler.allNotifsActiveKey,vh.checkCB.isChecked());
Log.i(TabSettingsActivity,检查+ Boolean.toString(器isChecked));
// INT rowPosition =(整数)buttonView.getTag();
共享preferencesHandler_settings.setSettingActive(buttonView.getTag()的toString(),器isChecked。);
// Log.i(位置,位置+ rowPosition);
//的getItem(rowPosition).setMarked(buttonView.isChecked());
。//Log.i("isChecked,vh.checkCB.getTag()的toString());
// Log.i(TabSettingsActivity,VH的标签:+ vh.checkCB.getTag()的toString());
//共享preferencesHandler_settings.setSettingActive(vh.checkCB.getTag()的toString(),器isChecked。);
//做的东西在这里。
}
});
convertView.setTag(VH);
Log.i(VH,VH+ vh.toString());
Log.i(位置,位置+位置);
如果需要的话//初始化sahred preFS
/ *如果(共享prefsHandler == NULL){
。共享prefsHandler.getInstance()initForNotifications(getActivity());
共享prefsHandler =共享prefsHandler.getInstance();
} * /
}
其他
VH =(RowSettingsViewHolder)convertView.getTag();
vh.checkCB.setTag(位置);
vh.checkCB.setChecked(vh.checkCB.isChecked());`
我查了一下我做的时候我遇到了类似的问题。其实,我将 OnCheckedChangeListener
只有一次(当行被即创建为 inflater.inflate()
)。我设置的行号标记的复选框
。
以下是我的code:
如果(convertView == NULL || convertView.getTag()== NULL){
持有人=新的持有人();
// TODO一套持有人在这里领域
holder.checkBox.setOnCheckedChangeListener(新OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,布尔器isChecked){
INT rowPosition =(整数)buttonView.getTag();
的getItem(rowPosition).setMarked(buttonView.isChecked());
}
});
convertView.setTag(保持器);
}
其他
支架=(座)convertView.getTag();
holder.checkBox.setTag(位置);
holder.checkBox.setChecked(item.isChecked());
I am working in an app in which I handle a ListView
which is composite with ViewHolder
. In this ViewHolder
, I have a CheckBox
. Here is my code:
private class SettingsArrayAdapter extends ArrayAdapter<Object> {
Context context;
ArrayList<Object> values;
RowSettingsViewHolder vh = null;
BigRowSettingsViewHolder bvh = null;
@Override
public int getItemViewType(int position) {
if (values.get(position) instanceof RowContent) {
return SMALL_ROW_DESIGN;
} else
return BIG_ROW_DESIGN;
// return super.getItemViewType(position);
}
@Override
public int getViewTypeCount() {
return 2;
}
public SettingsArrayAdapter(Context context, ArrayList<Object> values) {
super(context, R.layout.row_settings, values);
this.context = context;
this.values = values;
}
// disable selection in title row
@Override
public boolean isEnabled(int position) {
return (position == 2 || position == 4 || position == 8 || position == 9 || position == 13) ? false : true;
}
public View getView(int position, View convertView, ViewGroup parent) {
vh = null;
bvh = null;
String sharedPrefKey;
// Log.i("VH", "vh tag: " +vh.toString());
int type = getItemViewType(position);
// big row excluded
if (type == SMALL_ROW_DESIGN) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings, parent, false);
vh = new RowSettingsViewHolder();
vh.titleTV = (TextView) convertView.findViewById(R.id.settings_row_title);
vh.subtitleTV = (TextView) convertView.findViewById(R.id.settings_row_subtitle);
vh.disclosureIV = (ImageView) convertView.findViewById(R.id.settings_disclosureIV);
vh.checkCB = (CheckBox) convertView.findViewById(R.id.settings_cB);
vh.separatorLine = (View) convertView.findViewById(R.id.settings_listView_separatorLine);
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
if (id != 0)
vh.checkCB.setButtonDrawable(id);
Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Light.otf");
vh.titleTV.setTypeface(tf);
convertView.setTag(vh);
Log.i("VH", "vh tag: " + vh.toString());
} else {
vh = (RowSettingsViewHolder) convertView.getTag();
vh.checkCB.setOnCheckedChangeListener(null);
}
vh.checkCB.setFocusable(false);
RowContent thisSetting = null;
thisSetting = (RowContent) values.get(position);
// set row values in view
vh.titleTV.setText(thisSetting.getTitle());
vh.disclosureIV.setImageDrawable(thisSetting.getDisclosureDrawable());
// subtitle
vh.subtitleTV.setText(thisSetting.getSubtitle());
String title = vh.titleTV.getText().toString();
String subtitle = vh.subtitleTV.getText().toString();
if (subtitle.equals("NOTIFICATIONS") || subtitle.equals("MUSIC") || subtitle.equals("EMAIL") || subtitle.equals("SYSTEM")) {
Typeface tfSubt = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Bold.otf");
vh.subtitleTV.setTypeface(tfSubt);
vh.separatorLine.setBackgroundColor(Color.BLACK);
} else {
Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Light.otf");
vh.subtitleTV.setTypeface(tf);
vh.separatorLine.setBackgroundColor(Color.LTGRAY);
}
// checkbox
if (!thisSetting.needsCheckBox()) {
vh.checkCB.setVisibility(View.INVISIBLE);
vh.checkCB.setOnClickListener(null);
} else {
vh.checkCB.setVisibility(View.VISIBLE);
if (title.equals(getResources().getString(R.string.Spotify))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isSpotifyActive());
sharedPrefKey = SharedPrefsHandler.spotifyKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.Google_Play))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isGooglePlayerActive());
sharedPrefKey = SharedPrefsHandler.googlePlayerKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.default_music_player))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isDefaultPlayerActive());
sharedPrefKey = SharedPrefsHandler.defaulPlayerKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.default_mail))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isDefaultEmailAppActive());
sharedPrefKey = SharedPrefsHandler.defaultEmailKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.Hotmail))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isHotmailActive());
sharedPrefKey = SharedPrefsHandler.hotmailKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.Gmail))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isGmailActive());
sharedPrefKey = SharedPrefsHandler.gmailKey;
vh.checkCB.setTag(sharedPrefKey);
} else if (title.equals(getResources().getString(R.string.enable_disable_all_notif))) {
vh.checkCB.setChecked(sharedPreferencesHandler_settings.areAllNotifsActive());
sharedPrefKey = SharedPrefsHandler.allNotifsActiveKey;
vh.checkCB.setTag(sharedPrefKey);
}
vh.checkCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
// Log.i("TabSettingsActivity", "checked");
Log.i("VH-2", "vh tag: " + vh.toString());
sharedPreferencesHandler_settings.setSettingActive(SharedPrefsHandler.allNotifsActiveKey, vh.checkCB.isChecked());
Log.i("TabSettingsActivity", "checked: " + Boolean.toString(isChecked));
// Log.i("isChecked", vh.checkCB.getTag().toString());
Log.i("TabSettingsActivity", "vh tag: " + vh.checkCB.getTag().toString());
sharedPreferencesHandler_settings.setSettingActive(vh.checkCB.getTag().toString(), isChecked);
// Do something here.
Log.i("VH-ID", "vh tag: " + vh.toString());
}
});
}
}
// big row
else {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings_big, parent, false);
bvh = new BigRowSettingsViewHolder(convertView);
convertView.setTag(bvh);
}
else {
bvh = (BigRowSettingsViewHolder) convertView.getTag();
}
bvh.setRowData();
}
return convertView;
}
}
What I am doing is stored in SharedPreferences
the ViewHolder
item values. When I put the tic in any CheckBox
it seems that everything is ok, but if I use the scroll, the tick disappears, then I have been investigating and I did the next:
I put this line:
Log.i("VH-ID", "vh tag: " +vh.toString());
When it is creating the ViewHolder, like this I can get the ID of each ViewHolder
, also I added the same line as above inside the listener method:
vh.checkCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
// Log.i("TabSettingsActivity", "checked");
Log.i("VH-2", "vh tag: " + vh.toString());
sharedPreferencesHandler_settings.setSettingActive(SharedPrefsHandler.allNotifsActiveKey, vh.checkCB.isChecked());
Log.i("TabSettingsActivity", "checked: " + Boolean.toString(isChecked));
// Log.i("isChecked", vh.checkCB.getTag().toString());
Log.i("TabSettingsActivity", "vh tag: " + vh.checkCB.getTag().toString());
sharedPreferencesHandler_settings.setSettingActive(vh.checkCB.getTag().toString(), isChecked);
// Do something here.
Log.i("VH-ID", "vh tag: " + vh.toString());
}
});
The thing is that for example when the application starts I can see all the ViewHolder
ID, but when I checked in anyone I cans see how the ID is different, so it is taking a different ViewHolder
that which I checked, and I do not have idea why take a different ID (ViewHolder
).
I made the changes which Sufian told me, this is the code, even so now I get a unfortunatly....
public View getView(int position, View convertView, ViewGroup parent){
vh = null;
bvh = null;
String sharedPrefKey;
int type = getItemViewType(position);
// big row excluded
if(type == SMALL_ROW_DESIGN){
if(convertView == null || convertView.getTag() == null){
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings, parent, false);
vh = new RowSettingsViewHolder();
vh.titleTV = (TextView) convertView.findViewById(R.id.settings_row_title);
vh.subtitleTV = (TextView) convertView.findViewById(R.id.settings_row_subtitle);
vh.disclosureIV = (ImageView) convertView.findViewById(R.id.settings_disclosureIV);
vh.checkCB = (CheckBox) convertView.findViewById(R.id.settings_cB);
vh.separatorLine = (View)convertView.findViewById(R.id.settings_listView_separatorLine);
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
if(id!=0)
vh.checkCB.setButtonDrawable(id);
Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Light.otf");
vh.titleTV.setTypeface(tf);
vh.checkCB.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
//Log.i("TabSettingsActivity", "checked");
sharedPreferencesHandler_settings.setSettingActive(SharedPrefsHandler.allNotifsActiveKey, vh.checkCB.isChecked());
Log.i("TabSettingsActivity", "checked: " +Boolean.toString(isChecked));
//Log.i("isChecked", vh.checkCB.getTag().toString());
Log.i("TabSettingsActivity", "vh tag: " +vh.checkCB.getTag().toString());
sharedPreferencesHandler_settings.setSettingActive(vh.checkCB.getTag().toString(), isChecked);
// Do something here.
}
});
convertView.setTag(vh);
Log.i("VH", "VH " +vh.toString());
Log.i("POSITION", "POSITION " +position);
// init sahredPrefs if necessary
/* if (sharedPrefsHandler == null) {
SharedPrefsHandler.getInstance().initForNotifications(getActivity());
sharedPrefsHandler = SharedPrefsHandler.getInstance();
}*/
}
else{
vh = (RowSettingsViewHolder) convertView.getTag();
vh.checkCB.setTag(position);
vh.checkCB.setChecked(vh.checkCB.isChecked());
}
RowContent thisSetting = null;
thisSetting = (RowContent)values.get(position);
// set row values in view
vh.titleTV.setText(thisSetting.getTitle());
vh.disclosureIV.setImageDrawable(thisSetting.getDisclosureDrawable());
// subtitle
vh.subtitleTV.setText(thisSetting.getSubtitle());
String title=vh.titleTV.getText().toString();
String subtitle=vh.subtitleTV.getText().toString();
if(subtitle.equals("NOTIFICATIONS") || subtitle.equals("MUSIC") || subtitle.equals("EMAIL") || subtitle.equals("SYSTEM")){
Typeface tfSubt = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Bold.otf");
vh.subtitleTV.setTypeface(tfSubt);
vh.separatorLine.setBackgroundColor(Color.BLACK);
}
else{
Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Decima Light.otf");
vh.subtitleTV.setTypeface(tf);
vh.separatorLine.setBackgroundColor(Color.LTGRAY);
}
// checkbox
if(!thisSetting.needsCheckBox()){
vh.checkCB.setVisibility(View.INVISIBLE);
vh.checkCB.setOnClickListener(null);
}
else{
vh.checkCB.setVisibility(View.VISIBLE);
if(title.equals(getResources().getString(R.string.Spotify))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isSpotifyActive());
sharedPrefKey = SharedPrefsHandler.spotifyKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.Google_Play))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isGooglePlayerActive());
sharedPrefKey = SharedPrefsHandler.googlePlayerKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.default_music_player))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isDefaultPlayerActive());
sharedPrefKey = SharedPrefsHandler.defaulPlayerKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.default_mail))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isDefaultEmailAppActive());
sharedPrefKey = SharedPrefsHandler.defaultEmailKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.Hotmail))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isHotmailActive());
sharedPrefKey = SharedPrefsHandler.hotmailKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.Gmail))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.isGmailActive());
sharedPrefKey = SharedPrefsHandler.gmailKey;
vh.checkCB.setTag(sharedPrefKey);
}
else if(title.equals(getResources().getString(R.string.enable_disable_all_notif))){
vh.checkCB.setChecked(sharedPreferencesHandler_settings.areAllNotifsActive());
sharedPrefKey = SharedPrefsHandler.allNotifsActiveKey;
vh.checkCB.setTag(sharedPrefKey);
}
/* vh.checkCB.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("TabSettingsActivity", "checked");
sharedPreferencesHandler_settings.setSettingActive(SharedPrefsHandler.allNotifsActiveKey, vh.checkCB.isChecked());
Log.i("isChecked", Boolean.valueOf(vh.checkCB.isChecked()).toString());
Log.i("isChecked", vh.checkCB.getTag().toString());
sharedPreferencesHandler_settings.setSettingActive(vh.checkCB.getTag().toString(), vh.checkCB.isChecked());
// Do something here.
}
}); */
}
}
//big row
else {
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_settings_big, parent, false);
bvh = new BigRowSettingsViewHolder(convertView);
convertView.setTag(bvh);
}
else{
bvh = (BigRowSettingsViewHolder)convertView.getTag();
}
bvh.setRowData();
}
return convertView;
}
}
I hope this can help to solved the problem
Here is the LogCat:
11-25 13:19:48.671: D/dalvikvm(24077): GC_FOR_ALLOC freed 81K, 2% free 9068K/9180K, paused 15ms, total 15ms
11-25 13:19:48.671: I/dalvikvm-heap(24077): Grow heap (frag case) to 9.687MB for 842416-byte allocation
11-25 13:19:48.681: D/dalvikvm(24077): GC_FOR_ALLOC freed <1K, 2% free 9890K/10004K, paused 10ms, total 10ms
11-25 13:19:48.751: D/dalvikvm(24077): GC_FOR_ALLOC freed 24K, 1% free 10214K/10272K, paused 11ms, total 11ms
11-25 13:19:48.761: I/dalvikvm-heap(24077): Grow heap (frag case) to 17.913MB for 8294416-byte allocation
11-25 13:19:48.781: D/dalvikvm(24077): GC_FOR_ALLOC freed 1K, 1% free 18312K/18376K, paused 12ms, total 12ms
11-25 13:19:48.872: W/dalvikvm(24077): Unable to resolve superclass of Lcom/ionglasses2/ble/DfuService; (1377)
11-25 13:19:48.872: W/dalvikvm(24077): Link of class 'Lcom/ionglasses2/ble/DfuService;' failed
11-25 13:19:48.872: E/dalvikvm(24077): Could not find class 'com.ionglasses2.ble.DfuService', referenced from method com.ionglasses2.ble.DiscoveryService.startDFUService
11-25 13:19:48.872: W/dalvikvm(24077): VFY: unable to resolve const-class 1240 (Lcom/ionglasses2/ble/DfuService;) in Lcom/ionglasses2/ble/DiscoveryService;
11-25 13:19:48.872: D/dalvikvm(24077): VFY: replacing opcode 0x1c at 0x000c
11-25 13:19:48.882: I/TabNotificationsActivity(24077): get view EventosArrayAdapter
11-25 13:19:48.892: I/SharedPrefsHandler(24077): getInstance
11-25 13:19:48.902: I/SharedPrefsHandler(24077): initForNotifications
11-25 13:19:48.902: I/SharedPrefsHandler(24077): getInstance
11-25 13:19:48.902: I/SharedPrefsHandler(24077): Event: CALLS getIsEventActive: false
11-25 13:19:49.002: D/dalvikvm(24077): GC_FOR_ALLOC freed 425K, 3% free 20304K/20760K, paused 13ms, total 13ms
11-25 13:19:49.022: I/Adreno-EGL(24077): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
11-25 13:19:49.052: D/OpenGLRenderer(24077): Enabling debug mode 0
11-25 13:19:49.052: I/TabNotificationsActivity(24077): get view EventosArrayAdapter
11-25 13:19:49.062: I/SharedPrefsHandler(24077): Event: CALLS getIsEventActive: false
11-25 13:19:49.072: I/TabNotificationsActivity(24077): get view EventosArrayAdapter
11-25 13:19:49.072: I/SharedPrefsHandler(24077): Event: SMS getIsEventActive: false
11-25 13:19:49.082: I/TabNotificationsActivity(24077): get view EventosArrayAdapter
11-25 13:19:49.082: I/SharedPrefsHandler(24077): Event: EMAIL getIsEventActive: false
11-25 13:19:49.082: I/TabNotificationsActivity(24077): get view EventosArrayAdapter
11-25 13:19:49.092: I/SharedPrefsHandler(24077): Event: TWITTER getIsEventActive: false
11-25 13:19:52.175: I/SharedPrefsHandler(24077): getInstance
11-25 13:19:52.185: I/SharedPrefsHandler(24077): initForSettings
11-25 13:19:52.185: I/SharedPrefsHandler(24077): getInstance
11-25 13:19:52.185: I/TabSettings(24077): mState: 0
11-25 13:19:52.185: E/TabSettingsActivity(24077): onResume:RegistermGattUpdateReceiver
11-25 13:19:52.205: I/VH(24077): VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c22fa8
11-25 13:19:52.205: I/POSITION(24077): POSITION 0
11-25 13:19:52.225: I/VH(24077): VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c27b78
11-25 13:19:52.225: I/POSITION(24077): POSITION 1
11-25 13:19:52.235: I/VH(24077): VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c2bda0
11-25 13:19:52.235: I/POSITION(24077): POSITION 2
11-25 13:19:52.245: I/VH(24077): VH com.ionglasses2.TabSettingsActivity$RowSettingsViewHolder@42c2fff0
11-25 13:19:52.245: I/POSITION(24077): POSITION 3
11-25 13:19:52.245: I/SharedPrefs(24077): info leida are All notif Active: true
11-25 13:19:52.245: I/SharedPrefs(24077): allNotifsActive value: true
11-25 13:19:52.245: I/TabSettingsActivity(24077): checked: true
11-25 13:19:52.245: D/AndroidRuntime(24077): Shutting down VM
11-25 13:19:52.245: W/dalvikvm(24077): threadid=1: thread exiting with uncaught exception (group=0x41615ba8)
11-25 13:19:52.255: E/AndroidRuntime(24077): FATAL EXCEPTION: main
11-25 13:19:52.255: E/AndroidRuntime(24077): Process: com.ionglasses2, PID: 24077
11-25 13:19:52.255: E/AndroidRuntime(24077): java.lang.NullPointerException
11-25 13:19:52.255: E/AndroidRuntime(24077): at com.ionglasses2.TabSettingsActivity$SettingsArrayAdapter$1.onCheckedChanged(TabSettingsActivity.java:1341)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.CompoundButton.setChecked(CompoundButton.java:127)
11-25 13:19:52.255: E/AndroidRuntime(24077): at com.ionglasses2.TabSettingsActivity$SettingsArrayAdapter.getView(TabSettingsActivity.java:1430)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.AbsListView.obtainView(AbsListView.java:2263)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.ListView.makeAndAddView(ListView.java:1790)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.ListView.fillDown(ListView.java:691)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.ListView.fillFromTop(ListView.java:752)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.ListView.layoutChildren(ListView.java:1630)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.AbsListView.onLayout(AbsListView.java:2091)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.View.layout(View.java:14817)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewGroup.layout(ViewGroup.java:4631)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.Choreographer.doFrame(Choreographer.java:544)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.os.Handler.handleCallback(Handler.java:733)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.os.Handler.dispatchMessage(Handler.java:95)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.os.Looper.loop(Looper.java:136)
11-25 13:19:52.255: E/AndroidRuntime(24077): at android.app.ActivityThread.main(ActivityThread.java:5017)
11-25 13:19:52.255: E/AndroidRuntime(24077): at java.lang.reflect.Method.invokeNative(Native Method)
11-25 13:19:52.255: E/AndroidRuntime(24077): at java.lang.reflect.Method.invoke(Method.java:515)
11-25 13:19:52.255: E/AndroidRuntime(24077): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
11-25 13:19:52.255: E/AndroidRuntime(24077): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
11-25 13:19:52.255: E/AndroidRuntime(24077): at dalvik.system.NativeStart.main(Native Method)
Finally I resolved the problem this is the code:
`vh.checkCB.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
//Log.i("TabSettingsActivity", "checked");
// sharedPreferencesHandler_settings.setSettingActive(SharedPrefsHandler.allNotifsActiveKey, vh.checkCB.isChecked());
Log.i("TabSettingsActivity", "checked: " +Boolean.toString(isChecked));
// int rowPosition = (Integer)buttonView.getTag();
sharedPreferencesHandler_settings.setSettingActive(buttonView.getTag().toString(), isChecked);
// Log.i("POSITION", "POSITION " +rowPosition);
// getItem(rowPosition).setMarked(buttonView.isChecked());
//Log.i("isChecked", vh.checkCB.getTag().toString());
// Log.i("TabSettingsActivity", "vh tag: " +vh.checkCB.getTag().toString());
// sharedPreferencesHandler_settings.setSettingActive(vh.checkCB.getTag().toString(), isChecked);
// Do something here.
}
});
convertView.setTag(vh);
Log.i("VH", "VH " +vh.toString());
Log.i("POSITION", "POSITION " +position);
// init sahredPrefs if necessary
/* if (sharedPrefsHandler == null) {
SharedPrefsHandler.getInstance().initForNotifications(getActivity());
sharedPrefsHandler = SharedPrefsHandler.getInstance();
}*/
}
else
vh = (RowSettingsViewHolder) convertView.getTag();
vh.checkCB.setTag(position);
vh.checkCB.setChecked(vh.checkCB.isChecked());`
I checked what I did when I faced similar issue. I actually set the OnCheckedChangeListener
only once (when the row was created i.e as inflater.inflate()
). And I set the row number as tag to the CheckBox
.
Following is my code:
if (convertView == null || convertView.getTag() == null) {
holder = new Holder();
//TODO set holder fields here
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int rowPosition = (Integer)buttonView.getTag();
getItem(rowPosition).setMarked(buttonView.isChecked());
}
});
convertView.setTag(holder);
}
else
holder = (Holder) convertView.getTag();
holder.checkBox.setTag(position);
holder.checkBox.setChecked(item.isChecked());
这篇关于问题ViewHolder选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!