ListView测试代码上的Android,Null指针异常

时间:2011-08-10 13:53:09

标签: android listview arraylist nullpointerexception listadapter

我正在构建一个使用ListView的应用程序和一个扩展BaseAdapter的自定义适配器来处理ListView的数据。代码如下:

newlist.java 编译/运行正常

public class newslist extends Activity {

    public static final String tag = "newslist";
    ListView listNews;
    MyListAdapter listAdapter;


    /** Set or Grab the URL */        
    public static final String parseURL = "http://www.example.com.gr/article.php";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newslist);

        /** Array Lists */
        ArrayList<String> titles = new ArrayList<String>();
        ArrayList<String> links = new ArrayList<String>();
        ArrayList<String> dates = new ArrayList<String>();

        Log.d(newslist.tag, "****** parseURL = " + parseURL);

        listNews = (ListView) findViewById(R.id.listNews);

        try {                  
            /** Open URL with Jsoup */
            Document doc = Jsoup.connect(parseURL).get();

            /** Grab classes we want */                   
            Elements pcontent = doc.getElementsByClass("content_title");
            Elements pdates = doc.getElementsByClass("content_datecreated_left");

            /** Loop for grabbing TITLES within parent element */
            for (Element ptitles : pcontent) {

                /** Grab Anchors */
                Elements ptitle = ptitles.getElementsByTag("a");
                for (Element title : ptitle) {
                  titles.add(title.text());
                }
            }

            /** Loop for grabbing LINKS within parent element */
            for (Element plinks : pcontent) {
                /** Grab anchors */
                Elements plink = plinks.getElementsByTag("a");
                for (Element link : plink) {                    
                  links.add(link.attr("abs:href")); /** parse absolute address */    
                }
            }

            /** Loop for grabbing DATES within parent element */
            for (Element pdate : pdates) {
                dates.add(pdate.text()) ;
            }

            //TODO: Regex on Date

            //String content: Main Activity Content

            int i=0;
            int num = titles.size();
            String[] printDates = new String[num];
            for (i=0; i < num; i++)
            {
                //substring(25) leaves a space after the date, eg "26/6/2011 "
                //content[i] = titles.get(i) + "\n Date: " + dates.get(i).substring(25);
                printDates[i] = dates.get(i).substring(25);
            }

            /** Create an ArrayAdapter, that will actually make the Strings above 
             * appear in the ListView */ 
            listAdapter = new MyListAdapter(this, titles, dates);
            listNews.setAdapter(listAdapter);

        } catch (Exception e) {
            Log.e(newslist.tag, "****** Failed to Parse URL:" + e.getMessage());
            e.printStackTrace();
        } 

    } /*- OnCreate End -*/

} /*- Class End -*/

MyListAdapter.java 在第75行运行NPE:

public class MyListAdapter extends BaseAdapter {

    public final static String tag = "MyListAdapter";
    public Context context;
    public ArrayList<String> title;
    public ArrayList<String> date;
    public LayoutInflater inflater;

    public MyListAdapter(Activity context, ArrayList<String> title, ArrayList<String> date) {
        super();
        this.context = context;
        this.title = title;
        this.date = date;

        this.inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        // Auto-generated method stub
        return this.title.size();
    }

    public Object getItem(int position) {
        //Auto-generated method stub
        return this.title.get(position);
    }

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

    private static class ViewHolder {
        TextView titleView;
        TextView dateView;
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        // Auto-generated method stub
        ViewHolder holder;

        Log.d(tag, "****** convertView: " + convertView);

        if (convertView == null)
        {
            convertView = inflater.inflate(R.layout.listrow, null);
            holder = new ViewHolder();
            holder.titleView = (TextView) convertView.findViewById(R.id.listTitle);
            holder.dateView = (TextView) convertView.findViewById(R.id.listDate);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        Log.d(tag, "****** Title: " + title.get(position));
        Log.d(tag, "****** findViewById: " + convertView.findViewById(R.id.listTitle));
        Log.d(tag, "****** holder.titleView: " + holder.titleView);


        holder.titleView.setText(title.get(position));
        holder.dateView.setText(date.get(position));

        //notifyDataSetChanged();

        return convertView;
    }

}

第75行是:

holder.titleView.setText(title.get(position));

但是我已将问题跟踪到第62行:

holder.titleView = (TextView) convertView.findViewById(R.id.listTitle);

从我的调试消息中可以看出 holder.titleView null

我已经尝试清理/删除bin文件夹并重建项目无济于事。我认为问题在于找不到View R.id.listTitle。但我不明白为什么。

我还会包含两个用于预览的xml文件

newslist.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
<TextView  
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/title"
    android:gravity="center|top"
    android:textSize="20dip"
    android:textStyle="bold"
    android:text="@string/titleNewslist"
    />
<ListView  
    android:id="@+id/listNews"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    >
</ListView>
</LinearLayout>

listrow.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:name="@+id/listTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top|left"
        android:textSize="18dip"
        android:textStyle="bold"
        android:text="TextView">
    </TextView>  
    <TextView
        android:name="@+id/listDate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="bottom|right"
        android:textSize="12dip"
        android:textStyle="bold"
        android:textColor="@android:color/white"
        android:text="TextView">
    </TextView>
</LinearLayout>

5 个答案:

答案 0 :(得分:1)

你永远不会给titleView分配任何东西。

你需要在super.onCreate()之后的onCreate()中执行以下操作

titleView = (TextView) this.getViewById(R.id.listTitle);

确保将titleView声明为您课程顶部的字段,以便课程的其余部分可以访问它,如果您需要。

希望这有帮助!

编辑:

我刚注意到的一个重要说明:

android:name="@+id/myName" 

不同
android:id="@+id/myName"

您需要确保声明ID,否则您将无法访问布局元素。

答案 1 :(得分:0)

我真的不了解ViewHolder的使用。

你应该这样做:

convertView = new YourViewClass();

在这个类中有两个文本视图的字段和一个onCreate,它膨胀listRow.xml并按id查找两个视图。

但是converview和view holder不应该不同,你不应该尝试将一个视图从一个组件传递到另一个组件。

此致  斯特凡

答案 2 :(得分:0)

当您的XML文件出现问题时,通常会出现NullPointerException。尽量不要结束你的

<TextView
    android:name="@+id/listTitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top|left"
    android:textSize="18dip"
    android:textStyle="bold"
    android:text="TextView">
</TextView>  

with&gt;而不是&gt;和

我不确定这是你问题的根源,但可能会发生。

希望它有所帮助。

答案 3 :(得分:0)

您正在将Activity上下文传递给MyListAdapter构造函数并分配给Context对象。

在构造函数中将Activity更改为Context,然后尝试

答案 4 :(得分:0)

@Snicolas:请查看此http://www.youtube.com/watch?v=wDBM6wVEO70(来自Google)以了解视图持有者。