[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]

解决方案 »

  1.   

     把setContentView(myListView);放在
     myListView = (ListView)findViewById(R.id.myListView);前面试试。
      

  2.   

    不是这个原因,是setContentView(myListView);的用法错误,setContentView的参数是一个layout,即layout的xml文件,楼主的参数是一个listview。
      

  3.   

    而且,也应该先把setContentView()放在findViewById前面,后面再重新设置自定义的setContentView().
      

  4.   

    不是啊,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. 
      

  5.   

      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);(上面都是未经验证的代码,示意一下)。
      

  6.   

    谢谢指导!是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?或者用另外一种方式,先  myListView = ListView(this); 然后setContentView(myListView),完全不用布局文件,是不是一般两者选一种?
      

  7.   

    是不是说,只有通过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方式的)