开发者

what can i do about this null pointer exception?

public class Display extends ListActivity 
{
    private ForumAdapter faHelper;
    private ProgressDialog dialog;  
    private String Url;
    private int success = 0;

    private SeparatedListAdapter sAdapter;
    private ListView list;

    private List<Map<String,?>> cat_list;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setTitle("Board Index");

        list = (ListView) findViewById(R.id.dlist);
        list.setOnItemClickListener(itemclicklistener());

        setContentView(R.layout.displaylist);

        faHelper = new ForumAdapter(this);

        Url = geturl(savedInstanceState);

        if (faHelper.isGood(Url))
        {
            Load();
        }
        else
        {
            alertdialog(0);
        }
    }

    private class pbar extends AsyncTask<String, Void, Int开发者_如何学Ceger> 
    {
        private final String message = "Loading. Please wait...";

        @Override
        protected void onPreExecute() 
        {
            dialog = ProgressDialog.show(Display.this, "", message, true);
        }

        @Override
        protected void onPostExecute(Integer result) 
        {
            success = result;
            dialog.dismiss();
            displaystuff();
        }

        protected Integer doInBackground(String... url) 
        {
            return faHelper.SourceDownload(url[0]);
        }
    }

    private void displaystuff()
    {
        if (success == 1)
        {
            sAdapter = new SeparatedListAdapter(this, R.layout.demoheader);

            for (Object row : faHelper.BoardIndex)
            {
                String[][] theRow = (String[][])row;
                String ctitle = "";
                cat_list = new LinkedList<Map<String,?>>();

                for (int i = 0; i < theRow.length; i++)
                {
                    if (i == 0) ctitle = theRow[i][0];

                    /* + "\n" + theRow[i][2]*/
                    cat_list.add(createObject(theRow[i][1], theRow[i][3]));
                }

                ExAdapter exone = new ExAdapter(this, R.layout.demorow, cat_list);
                sAdapter.addSection(ctitle, exone);
            }
            list.setAdapter(sAdapter);
        }
        else
        {
            alertdialog(1);
        }
    }

    private OnItemClickListener itemclicklistener()
    {
        return new OnItemClickListener() 
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            {
                @SuppressWarnings("unchecked") // Object to Map.
                Map<String,?> one = (Map<String,?>) parent.getAdapter().getItem(position);
                Toast.makeText(getApplicationContext(), one.get("title").toString(), Toast.LENGTH_SHORT).show();
            }
        };
    }

    private void alertdialog(int which)
    {
        switch (which)
        {
        case 0:
            new AlertDialog.Builder(this)
            .setTitle("Alert")
            .setMessage("Connection Error!!!" + "\n\n" + faHelper.rstring)
            .setPositiveButton("OK", new OnClickListener() 
            {
                public void onClick(DialogInterface arg0, int arg1) 
                {
                    Display.this.finish();
                }
            })
            .show();
            break;
        case 1:
            new AlertDialog.Builder(this)
            .setTitle("Alert")
            .setMessage("Error!!" + "\n\n" + "Press OK to try again!")
            .setPositiveButton("OK", new OnClickListener() 
            {
                public void onClick(DialogInterface arg0, int arg1) 
                {
                    Load();
                }
            })
            .setPositiveButton("Cancel", new OnClickListener() 
            {
                public void onClick(DialogInterface arg0, int arg1) 
                {
                    success = 1;
                    Display.this.finish();
                }
            })
            .show();
            break;
        }
    }

    public Map<String,?> createObject(String title, String image) 
    {
        Map<String,String> item = new HashMap<String,String>();  
        item.put("title", title);
        item.put("image", image);
        return item;
    }

    public void refresh(View view)
    {
        Load();
    }

    private void Load()
    {
        new pbar().execute(Url);
    }

    private String geturl(Bundle savedInstanceState)
    {
        String url = (savedInstanceState == null) ? null : (String) savedInstanceState.getSerializable("URL");

        if (url == null) 
        {
            Bundle extras = getIntent().getExtras();
            url = extras != null ? extras.getString("URL") : null;
        }

        return url;
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) 
    {
        super.onSaveInstanceState(outState);
        outState.putSerializable("URL", Url);
    }

    @Override
    protected void onPause() 
    {
        super.onPause();
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
    }
}

this line of code is for some reason creating a null pointer exception, and i have no idea why.

list.setOnItemClickListener(itemclicklistener());

when i just simply create a listview with code, it seems to work just fine. but when im actually setting it to be a listview inside a linearlayout, everything is fine except for the click listener. any advice would be help full.

the xml's are as follows:

displaylist.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:orientation="vertical">    

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button 
            android:onClick="refresh" 
            android:text="Refresh" 
            android:id="@+id/refresh" 
            android:layout_width="match_parent"
            android:layout_height="32dp">
        </Button>
    </LinearLayout>
    <ListView 
        android:id="@+id/dlist" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content">
        </ListView>
</LinearLayout>

header.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/demoheader_title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="2dip"
    android:paddingBottom="2dip"
    android:paddingLeft="5dip"
    android:background="#FFFFFF"
    style="?android:attr/listSeparatorTextViewStyle"
    />

row.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:width="50dp"
        android:height="50dp"
        android:scaleType="fitStart"
        android:paddingRight="5dp"
        />

    <TextView
        android:id="@+id/text2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="false"
        android:textAppearance="?android:attr/textAppearanceSmall"  
        />  
</LinearLayout>


setContentView(R.layout.something) put this first after write findviewbyid function then you will not find this null pointer exception


If you are not using androids id for ListView you cannot extends the class by ListActivity you have to extend it with Activity.

You should use Androids id if you extend Class by ListActivity

android:id="@android:id/list

But if you are using android:id="@+id/dlist" then you have to extend class with Activity

Also you show use setContentView(R.layout.displaylist); before fetching the id

list = (ListView) findViewById(R.id.dlist);
        list.setOnItemClickListener(itemclicklistener());


You need to call setContentView() before findViewById() or it will return null. Modify your code so it looks like this:

setContentView(R.layout.displaylist);

list = (ListView) findViewById(R.id.dlist);
list.setOnItemClickListener(itemclicklistener());
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜