исключение нулевого указателя в Android? - PullRequest
0 голосов
/ 11 ноября 2011

enter image description here Я хочу, чтобы мое приложение выглядело так.Я могу получить имена и типы в двух разных массивах, но получаю исключение нулевого указателя в строке, помеченной в code.names и массив типов, получаю значения, как я и предполагал. Я дважды проверил мои файлы макета, один из которых содержит представление списка, а другой - два.текстовое представление. любая помощь была бы весьма заметна ..

 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 ]

5 голосов
/ 11 ноября 2011

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

 setContentView(R.layout.main);

причина, по которой

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

updated:

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

Строки:

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

и пишут так

lv = getListView();

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

отметьте это http://www.vogella.de/articles/AndroidListView/article.html aritcles

0 голосов
/ 12 ноября 2011

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

0 голосов
/ 11 ноября 2011

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

0 голосов
/ 11 ноября 2011

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

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

, убедившись, что ваш lv не получает ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...