android中的空指针异常?

时间:2011-11-11 13:48:23

标签: android listview nullpointerexception

enter image description here 我希望我的应用程序看起来像这样。 我能够在两个不同的数组中获取名称和类型,但在code.names和type数组中标记的行获取空指针异常正在获取我想要的值。我已经仔细检查了我的布局文件,其中一个包含列表视图,另一个包含两个文本视图。任何帮助都会非常明显..

 package application.test;
    import java.util.HashMap;
    import android.app.ListActivity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.widget.ListView;

        public class TestActivity<types, names> extends ListActivity{

            int count[];
            int typecount[];
            ListView lv;
            ListViewAdapterrecent lva;
            String[] names;
            String[] types;
            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);

                setContentView(R.layout.main);
                lv=(ListView)findViewById(android.R.id.list);

                ContentResolver tcr = getContentResolver();
                 Cursor tcur=tcr.query(ContactsContract.Data.CONTENT_URI, null, null, null, null);


                 HashMap<Integer, String> typehashmap=new HashMap<Integer, String>();
               HashMap<Integer, String> namehashmap=new HashMap<Integer, String>();

               if(tcur.getCount()>0)
               { 
                  while(tcur.moveToNext())
                  {
                  Boolean temp=false;   
                  String nvalues=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.DATA2));

                  if (Integer.parseInt(nvalues)==1){
                   String value="home";
                   temp=true;
                  String rw=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
                  int key=Integer.parseInt(rw);
                  typehashmap.put(key, value);
                  }

                  else if(Integer.parseInt(nvalues)==2)
                  {
                   String value="mobile";
                  temp=true;
                   String rw=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
                   int key=Integer.parseInt(rw);
                   typehashmap.put(key, value);
                  }

                  else
                  {
                  String value="work";
                  temp=true;
                   String rw=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
                   int key=Integer.parseInt(rw);
                   typehashmap.put(key, value);
                  }

                  if(temp==true)
                  {
                      tcur.moveToNext();
                      String rw=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID)); 
                      int key=Integer.parseInt(rw);
                      String zvalues=tcur.getString(tcur.getColumnIndex(ContactsContract.Data.DATA2));
                       namehashmap.put(key, zvalues);
                     }
                 }//while
               tcur.close();

        types=  typehashmap.values().toArray(new String[typehashmap.size()]);
          names= namehashmap.values().toArray(new String[namehashmap.size()]);
               lva=new ListViewAdapterrecent(this,names,types);            
           lv.setAdapter(lva);
 }
         }
       }

    listviewrecent.java.............

    package application.test;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;

    public class ListViewAdapterrecent extends BaseAdapter{

        Activity context;
        String[] names;
        String[] types;

        public ListViewAdapterrecent(Activity context, String[] names, String[] types) {
            // TODO Auto-generated constructor stub

        this.context=context;
        this.names=names;
        this.types=types;
        }   

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return names.length;
        }

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

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        public class viewHolder {
            TextView top;
            TextView bottom;
        }

          public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            viewHolder holder;
            if(convertView==null){

           LayoutInflater inflator=context.getLayoutInflater();
            convertView=inflator.inflate(R.layout.textviewonly,null);

            holder=new viewHolder();
            holder.top=(TextView)convertView.findViewById(R.id.toptext);
            holder.bottom=(TextView)convertView.findViewById(R.id.bottomtext);
            convertView.setTag(holder);
            }else{
                holder=(viewHolder)convertView.getTag();
            }

            holder.top.setText(names[position]);
            holder.bottom.setText(types[position]);

            return convertView;
        }
    }

4 个答案:

答案 0 :(得分:5)

只需删除此行中的评论

 setContentView(R.layout.main);

原因

因为您使用其id从xml文件获取列表对象,所以您必须首先设置包含该控件的布局。

更新

你在这里合并到概念 您扩展了ListActivity,并使用它的id从xml文件中获取ListView对象。您可以使用此代码扩展活动并运行它,或者您可以将这些行放入注释并运行它。

行是:

lv=(ListView)findViewById(android.R.id.list);

以这种方式写作

lv = getListView();

如果扩展ListActivity,那么您可以像这样获取当前的ListView对象,或者如果您想自定义然后扩展Activity而不是ListActivity

检查此http://www.vogella.de/articles/AndroidListView/article.html aritcles

答案 1 :(得分:0)

确保 lv 的变量不为空。您可以尝试测试是否

    lv=(ListView)findViewById(android.R.id.list);

正在努力确保您的lv不会收到空值。

答案 2 :(得分:0)

表示在您的主布局中,您没有ID为“list”的列表视图

答案 3 :(得分:0)

编辑后的版本运行正常。我在实际创建之前将参数名称和类型传递给类listviewadapterrecent,从而将null传递给适配器类,并将空值传递给列表视图,从而获得空指针异常。