我希望我的应用程序看起来像这样。 我能够在两个不同的数组中获取名称和类型,但在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;
}
}
答案 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传递给适配器类,并将空值传递给列表视图,从而获得空指针异常。