跪求求高手们帮忙看看问题在哪?
[color=#008000]//代码如下,ddms上显示NullPointerException ,问题出在哪?跪求答案!/**
*
*/
package zhou.android.ListActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* @author Administrator
*
*/
public class ListActivityTest extends ListActivity {
private ListView myListView = null;
private static final String TAG = "LOG_V";
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
myListView = (ListView)findViewById(R.id.myListView);
ArrayList<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String,String> map1 = new HashMap<String,String>();
Map<String,String> map2 = new HashMap<String,String>();
Map<String,String> map3 = new HashMap<String,String>();
map1.put("user_name", "zhangsan");
map1.put("user_ip", "192.168.0.1");
map2.put("user_name", "lisi");
map2.put("user_ip", "192.168.0.2");
map3.put("user_name", "wangwu");
map3.put("user_ip", "192.168.0.3");
list.add(map1);
list.add(map2);
list.add(map3);
SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.user,new String[]{"user_name","user_ip"},
new int[] {R.id.user_name,R.id.user_ip});
:
myListView.setAdapter(listAdapter);
setContentView(myListView);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Log.v(TAG,"id----------" + id);
Log.v(TAG,"position-----------" + position);
}
}
[/color] --------------------编程问答-------------------- 把setContentView(myListView);放在
myListView = (ListView)findViewById(R.id.myListView);前面试试。
--------------------编程问答--------------------
不是这个原因,是setContentView(myListView);的用法错误,setContentView的参数是一个layout,即layout的xml文件,楼主的参数是一个listview。 --------------------编程问答-------------------- 而且,也应该先把setContentView()放在findViewById前面,后面再重新设置自定义的setContentView(). --------------------编程问答--------------------
不是啊,setContentView()是可以传入一个View类型的控件的:
void setContentView(int layoutResID)
Set the activity content from a layout resource.
void setContentView(View view, ViewGroup.LayoutParams params)
Set the activity content to an explicit view.
void setContentView(View view)
Set the activity content to an explicit view.
--------------------编程问答-------------------- myListView = (ListView)findViewById(R.id.myListView);
这句调用在setContentView(myListView)之前了。
activity还没有inflate出来任何一个view,那么myListView必然是null值。我想myListView.setAdapter(listAdapter);这句已经开始报错了。
建议一,改为: setContentView(R.layout.listview);
myListView = (ListView)findViewById(R.id.myListView);
建议二, 改为:
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
myListView = (ListView)inflater.inflate(R.layout.listview, null);
setContentView(myListView);
(上面都是未经验证的代码,示意一下)。 --------------------编程问答--------------------
谢谢指导!
是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?
或者用另外一种方式,先 myListView = ListView(this); 然后setContentView(myListView),完全不用布局文件,是不是一般两者选一种? --------------------编程问答-------------------- 是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?
ANS:setContentView里肯定是去解析xml,然后将这些布局加载到view上。当调用完setContentView之后,就代表程序已经生成了这个布局,那再去findViewById,就可以访问到布局中的控件了。
或者用另外一种方式,先 myListView = ListView(this); 然后setContentView(myListView),完全不用布局文件,是不是一般两者选一种?
ANS:你说的这种方式是用过代码来动态生成layout布局,是可以的,xml方式也好,代码方式也好,最终都要setContentView,不过xml方式比较直观,看你习惯哪种了(感觉android还是比较推崇xml方式的) --------------------编程问答-------------------- --------------------编程问答--------------------
嗯嗯,明白了,严重感谢!
补充:移动开发 , Android