исключение нулевого указателя в Android?

#android #listview #nullpointerexception

#Android #listview #исключение nullpointerexception

Вопрос:

введите описание изображения здесь Я хочу, чтобы мое приложение выглядело следующим образом. Я могу получать имена и типы в двух разных массивах, но получаю исключение нулевого указателя в строке, отмеченной в коде.имена и массив типов получают значения, как я и предполагал.Я дважды проверил свои файлы макета, один из которых содержит представление списка, а другой содержит два текстовых представления. любая помощь была бы очень ценной..

  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;
        }
    }
  

Ответ №1:

просто удалите комментарий из этой строки

  setContentView(R.layout.main);
  

причина, почему

поскольку вы получаете объект list из xml-файла, используя его идентификатор, поэтому вам сначала нужно установить тот макет, который содержит этот элемент управления.

обновлено:

при объединении с concept здесь вы расширяете ListActivity, а также получаете объект ListView из xml-файла, используя его идентификатор. Либо вы можете расширить действие с помощью этого кода и запустить его, либо вы можете поместить эти строки в комментарий и запустить его.

Строки являются:

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

и напишите так

 lv = getListView();
  

Если вы расширяете ListActivity, то вы можете получить текущий объект ListView следующим образом или, если вы хотите настроить, затем расширяет Activity вместо ListActivity

проверьте это http://www.vogella.de/articles/AndroidListView/article.html ссылки

Комментарии:

1. Я вставил отредактированную версию. Я вырезал две строки, в которых передавал параметр классу listviewadapterrecent, и вставил их в последнюю, и все работает нормально…..

Ответ №2:

Убедитесь, что переменная для lv не равна нулю. Вы можете попробовать проверить, если

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

работает, гарантируя, что ваш lv не получит значение null.

Комментарии:

1. да, это null. что это значит и как я предполагаю избавиться от этого

Ответ №3:

означает, что в вашем основном макете у вас нет listview с идентификатором «список»

Ответ №4:

Отредактированная версия просто отлично работает.Я передавал имена параметров и типы классу listviewadapterrecent до того, как они были фактически созданы, передавая null классу адаптера и получая нулевые значения в list view, таким образом, получая исключение нулевого указателя.