ListView之于BaseAdapter,

Crane023 2015-08-14 05:05:59
功能是:把手机上电话号码以列表+checkbox形式,在AlertDialog.Builder对象上显示出来,勾选后点确认完成.
片段如下:需要加一个final boolean debug=true; ArrayList<String> blocklist= new ArrayList<String>();
问题写在代码的注释里的,为1、2、3、4条。
				final Cursor cursor_phone= getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,null,null,null);
if(debug)
System.out.println("<log> cursor_phone set successfully");
BaseAdapter baseadapter = new BaseAdapter(){
/**
* 1. 这里加个if(debug) System.out.println("");会导致Syntax error on tokens,misplaced coonstructs
* 等莫名其妙的句法问题。不知何解。
* 2. getCount会在blockListV.setAdapter(baseadapter);之后重复回调约10次,不知为何。
* */t.println("<log> BaseAdapter getCount:"+
cursor_phone.getCount());
return cursor_phone.getCount();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
/**
* 3. getView也会在blockListV.setAdapter(baseadapter);之后重复回调约10次,不知为何。
*/
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
if(debug)
System.out.println("<log> BaseAdapter getView<"+position+">");
CheckBox adptCheckBox= new CheckBox(BlockCall.this);
if(cursor_phone.moveToPosition(position)){
String phone_number= cursor_phone.getString(cursor_phone.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
if(debug)
System.out.println("<log> cursor_phone.getnumber:"+phone_number
+"<"+position+">");

adptCheckBox.setText(phone_number);
if(inBlockList(phone_number)){
adptCheckBox.setChecked(true);
}

}
return adptCheckBox;
}
};
if(debug)
System.out.println("<log> just after BaseAdapter");
View view = getLayoutInflater().inflate(R.layout.list_view, null);
/**
* ListView获取实例时activity stop
* 问题在:layout的.xml文件把ListView弄错了
*/
final ListView blockListV= (ListView)view.findViewById(R.id.base_adpt_checkbox);
blockListV.setAdapter(baseadapter);
if(debug)
System.out.println("<log> block listview setadapter");
new AlertDialog.Builder(BlockCall.this).setTitle(R.string.contacts_list)
.setView(view).setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
/**
* 这里加个if(debug) System.out.println("");会导致Syntax error on tokens,misplaced coonstructs
* 等莫名其妙的句法问题。不知何解。
* */
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if(debug)
System.out.println("<log> DialogInterface, blocklist OnClick");
blocklist.clear();
if(debug)
System.out.println("<log> blocklist cleared:"+blocklist+
";\n==blockListV.getCount():"+blockListV.getCount());
/**
* 4. 如果存在着空的电话号码,点击确认后,activity 会stop 掉。
* 现象是:getCount=16,但for结构里只执行到0-13就stop了,14和15未执行
* getChildAt(i)中的i与position错位,导致越界。但不知为何。
* 详细是i=0时,获取的是position=2的号码;i=13时,得到的是position=15的号码
*/
for(int i=0; i< blockListV.getCount(); i++){
CheckBox blockChild=new CheckBox(BlockCall.this);
blockChild=(CheckBox)blockListV.getChildAt(i);
if(debug)
System.out.println("<log> (blockChild["+i+"].getText():"+
(blockChild).getText().toString()+
" | isChecked:"+blockChild.isChecked());
if(blockChild.isChecked()){
blocklist.add((blockChild).getText().toString());
}
}
if(debug)
System.out.println("blocklist, after added:"+blocklist);
}
}).show();
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
翼德兄 2015-08-17
  • 打赏
  • 举报
回复
引用 7 楼 Crane023 的回复:
[quote=引用 5 楼 yide55 的回复:] 你确定是一百多次?也就是同一个position的getview被调用了多次?要是这样那基本上就是你代码问题了,blockListV.setAdapter(baseadapter);这个地方打log,看执行了几次,,其它有notifydatachange的地方也打log。
setadapter,打过log,只执行了一次。 “其它有notifydatachange的地方”是指什么地方?[/quote] 只留下setAdapter相关的代码,其它所有都删除了,再看现象。
Crane023 2015-08-17
  • 打赏
  • 举报
回复
引用 5 楼 yide55 的回复:
你确定是一百多次?也就是同一个position的getview被调用了多次?要是这样那基本上就是你代码问题了,blockListV.setAdapter(baseadapter);这个地方打log,看执行了几次,,其它有notifydatachange的地方也打log。
setadapter,打过log,只执行了一次。 “其它有notifydatachange的地方”是指什么地方?
Crane023 2015-08-17
  • 打赏
  • 举报
回复
引用 5 楼 yide55 的回复:
你确定是一百多次?也就是同一个position的getview被调用了多次?要是这样那基本上就是你代码问题了,blockListV.setAdapter(baseadapter);这个地方打log,看执行了几次,,其它有notifydatachange的地方也打log。
setadapter,打过log,只执行了一次。 “其它有notifydatachange的地方”是指什么地方?
翼德兄 2015-08-15
  • 打赏
  • 举报
回复
10条是屏幕上能显示的条目数,你数数? 错位的问题,如果没有headviewer的前提,,是因为getchlidAt也是获取屏幕上能显示的view。 if(debug)的问题这这句话没什么关系,仔细看看吧,找不出就先删了这句,说不定你就发现问题了。
翼德兄 2015-08-15
  • 打赏
  • 举报
回复
你确定是一百多次?也就是同一个position的getview被调用了多次?要是这样那基本上就是你代码问题了,blockListV.setAdapter(baseadapter);这个地方打log,看执行了几次,,其它有notifydatachange的地方也打log。
Crane023 2015-08-15
  • 打赏
  • 举报
回复
引用 3 楼 yide55 的回复:
[quote=引用 2 楼 Crane023 的回复:] [quote=引用 1 楼 yide55 的回复:] 10条是屏幕上能显示的条目数,你数数? 错位的问题,如果没有headviewer的前提,,是因为getchlidAt也是获取屏幕上能显示的view。 if(debug)的问题这这句话没什么关系,仔细看看吧,找不出就先删了这句,说不定你就发现问题了。
屏幕上显示不了10条,但会自动生成滚动条,可向下翻动的。[/quote]额,几条无所谓,这个数目就是getView一次调用的次数[/quote] 呃,没对。那个10次,是指10个循环。比如说我有getCount=16,getView就应该回调16次,但事实上却回调了16*10=160次。
翼德兄 2015-08-15
  • 打赏
  • 举报
回复
引用 2 楼 Crane023 的回复:
[quote=引用 1 楼 yide55 的回复:] 10条是屏幕上能显示的条目数,你数数? 错位的问题,如果没有headviewer的前提,,是因为getchlidAt也是获取屏幕上能显示的view。 if(debug)的问题这这句话没什么关系,仔细看看吧,找不出就先删了这句,说不定你就发现问题了。
屏幕上显示不了10条,但会自动生成滚动条,可向下翻动的。[/quote]额,几条无所谓,这个数目就是getView一次调用的次数
Crane023 2015-08-15
  • 打赏
  • 举报
回复
引用 1 楼 yide55 的回复:
10条是屏幕上能显示的条目数,你数数? 错位的问题,如果没有headviewer的前提,,是因为getchlidAt也是获取屏幕上能显示的view。 if(debug)的问题这这句话没什么关系,仔细看看吧,找不出就先删了这句,说不定你就发现问题了。
屏幕上显示不了10条,但会自动生成滚动条,可向下翻动的。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧