#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, таким образом, получая исключение нулевого указателя.