com.sibext.android_shelf.adapter.ShelfAdapter.getSubItemsCount(ShelfAdapter.java:96)中的java.lang.NullPointerException

时间:2013-11-24 17:29:58

标签: java android nullpointerexception

您好我正在开发一个应用程序,它将成为Android启动器,此启动器中有三个不同的屏幕,第一个屏幕是一个应该导入的书架,显示设备上SD卡位置的所有书籍当我带来我的代码时,没有错误,但是当它在我的设备和模拟器上启动时,应用程序会自动崩溃。

logcat的:

11-24 11:23:30.208: E/AndroidRuntime(16101): FATAL EXCEPTION: main
11-24 11:23:30.208: E/AndroidRuntime(16101): java.lang.NullPointerException
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.sibext.android_shelf.adapter.ShelfAdapter.getSubItemsCount(ShelfAdapter.java:96)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.sibext.android_shelf.adapter.ShelfAdapter.getCount(ShelfAdapter.java:91)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.ListView.setAdapter(ListView.java:463)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.sibext.android_shelf.adapter.ShelfAdapter.setToListView(ShelfAdapter.java:77)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at it.gmariotti.android.examples.googleaccount.Book.onCreateView(Book.java:199)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.View.measure(View.java:15848)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.Choreographer.doFrame(Choreographer.java:532)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.os.Handler.handleCallback(Handler.java:730)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.os.Looper.loop(Looper.java:137)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at android.app.ActivityThread.main(ActivityThread.java:5103)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at java.lang.reflect.Method.invokeNative(Native Method)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at java.lang.reflect.Method.invoke(Method.java:525)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-24 11:23:30.208: E/AndroidRuntime(16101):    at dalvik.system.NativeStart.main(Native Method)

Book.java:

package com.d4a.tobias;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockFragment;
import com.d4a.tobias.R;
import com.sibext.android_shelf.ImportBooks;
import com.sibext.android_shelf.adapter.ShelfAdapter;

public class Book extends SherlockFragment {

    Button bt1;
     //Shelf
        private static final String TARGET_DIRECTORY = "mnt/sdcard/shelf/";
        private ListView list;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Get the view from fragmenttab1.xml
        View v=inflater.inflate(R.layout.fragmenttab1, container, false);

        File dir = new File(TARGET_DIRECTORY);
        if(!dir.exists()){
            dir.mkdirs();
            //past here
            addBooksFromAssetsToCard();
        }else{
            String files[] = dir.list();
            if(files.length == 0){
                //past here
                addBooksFromAssetsToCard();
            }
        }

        list = (ListView) v. findViewById(R.id.list);


        //buttons for toolbelt do not take out!!

          v. findViewById(R.id.button10).setOnClickListener(new OnClickListener()

   {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub



                String url = "http://www.google.com";
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(browserIntent);
            }
        });


   v. findViewById(R.id.button11).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub



                //  String url = "http://www.google.com";
                //  Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            //      startActivity(browserIntent);



            Intent i=new Intent(getActivity().getApplicationContext(),Launchalot.class);

            startActivity(i);


        }

   });


   v. findViewById(R.id.tools).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub



            //  String url = "http://www.google.com";
            //  Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        //      startActivity(browserIntent);



                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.setComponent(new ComponentName("com.d4a.stz","com.d4a.stz.ToolsHome"));
                intent.putExtra("grace", "Hi");
                startActivity(intent);


    }

});



    v. findViewById(R.id.googleplay).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub



            //  String url = "http://www.google.com";
            //  Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            //      startActivity(browserIntent);



            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse("http://play.google.com/store/apps"));
            startActivity(intent);


        }

    });

    v. findViewById(R.id.youtube).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            //  String url = "http://www.google.com";
            //  Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            //      startActivity(browserIntent);


            Intent videoClient = new Intent(Intent.ACTION_VIEW);
            videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
            startActivity(videoClient);


        }

    });

    v. findViewById(R.id.email).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setComponent(new ComponentName("com.d4a.eMailTime","com.fsck.k9.activity.Accounts"));
            intent.putExtra("grace", "Hi");
            startActivity(intent);




        }

    });


        ShelfAdapter adapter = new ShelfAdapter(this, TARGET_DIRECTORY);
        adapter.setToListView(list);
        return v;

    }



    public void addBooksFromAssetsToCard(){
        List<String> books;
        try {
            books = getBooksFromAsset(getActivity());

            for(String book : books){
                copyFromAssets(book);
            }

        } catch (Exception e) {
        }
    }

    public List<String> getBooksFromAsset(Context ctx) throws Exception
    {
        AssetManager assetManager =ctx.getAssets();
        String[] files = assetManager.list("books");
        List<String> it=Arrays.asList(files);
        return it;
    }

    public void copyFromAssets(String book)
    {
        AssetManager assetManager = getActivity().getAssets();
        String[] files = null;
        InputStream in = null;
        OutputStream out = null;
        //String filename = "filename.ext";
        try
        {
            in = assetManager.open("books/"+book);
            out = new FileOutputStream(Environment.getExternalStorageDirectory()+File.separator+"/shelf/"+book);
            Log.d("Copying...", ""+book);
            copyFile(in, out); 
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        }
        catch(Exception e)
        { 
            Log.e("tag", "Failed to copy asset file: " + book, e);
        }      
    }
    public void copyFile(InputStream in, OutputStream out) throws Exception
    {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1)
        {
            out.write(buffer, 0, read);
        }
        Log.d("Copy_State", "Done...");
    }

    public void onImportClicked(View v){
        Toast.makeText(getActivity(), "Please Wait", Toast.LENGTH_LONG)
         .show();
        Intent in = new Intent(getActivity(), ImportBooks.class);
        startActivity(in);











        return;

    }













}

ShelfAdapter.java

package com.sibext.android_shelf.adapter;


import java.io.File;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.SparseArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.Toast;

import com.d4a.tobias.Book;
import com.d4a.tobias.R;
import com.sibext.android_shelf.MainActivity;
import com.sibext.android_shelf.shelf.ShelfItem;

public class ShelfAdapter extends BaseAdapter {

    private static final int ROW_COUNT_DEFAULT = 2;
    private static final int ROW_COUNT_LAND_DEFAULT = 4;
    private static final int ROW_HEIGHT_DEFAULT = 150;

    private Context context;

    private int rowCount = ROW_COUNT_DEFAULT;
    private int rowCountLand = ROW_COUNT_LAND_DEFAULT;
    private int rowHeight = ROW_HEIGHT_DEFAULT;

    private SparseArray<LoadPreviewTask> taskPool;

    private ArrayList<ShelfItem> items;
    String PATH;
    ShelfItem item;


    public ShelfAdapter(Context context, String targetDir) {
        this.context = context;

        items = new ArrayList<ShelfItem>();
        taskPool = new SparseArray<ShelfAdapter.LoadPreviewTask>();

        if (targetDir == null || context == null) {
            throw new NullPointerException("ShelfAdapter: wrong paramenters - " +
                    (targetDir == null ? "Target directory " : "Context ") + "is null");
        }

        File dir = new File(targetDir);
        if(dir.exists() && dir.isDirectory()){
            for(File f : dir.listFiles()){
                if(f != null && f.getName().endsWith(".pdf")){
                    items.add(new ShelfItem(f));
                }
            }
        }
    }

    public ShelfAdapter(Book book, String targetDirectory) {
        // TODO Auto-generated constructor stub
    }

    public void setToListView(ListView list){
        list.setDividerHeight(0);
        list.setAdapter(this);
    }

    public void setRowCount(int rowCount, int rowCountLand) {
        this.rowCount = rowCount;
        this.rowCountLand = rowCountLand;
    }

    public void setRowHeight(int rowHeight) {
        this.rowHeight = rowHeight;
    }

    @Override
    public int getCount() {
        int sub = getSubItemsCount(); 
        return (int)(sub/getRowCount()) + (sub%getRowCount() == 0 ? 0 : 1);
    }

    public int getSubItemsCount(){
        return items.size();
    }

    @Override
    public ShelfItem getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            holder = new ViewHolder();
            convertView = View.inflate(context, R.layout.shelf_row, null);
            AbsListView.LayoutParams itemParams = new AbsListView.LayoutParams(
                    AbsListView.LayoutParams.MATCH_PARENT, rowHeight);
            convertView.setLayoutParams(itemParams);

            LinearLayout.LayoutParams subItemParams = getSubViewParams();
            for(int i = 0; i < getRowCount(); i++){
                View sub = getSubView(getSubPosition(position, i), null);
                sub.setLayoutParams(subItemParams);
                ((ViewGroup)convertView).addView(sub);
                holder.subViews.add(sub);
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
            for(int i = 0; i < holder.subViews.size(); i++){
                getSubView(getSubPosition(position, i), holder.subViews.get(i));
            }
        }
        return convertView;
    }


    public View getSubView(final int position, View convertView){
        final SubViewHolder holder;
        if(convertView == null){
            convertView = View.inflate(context, R.layout.shelf_item, null);
            holder = new SubViewHolder();
            holder.img = (ImageView)convertView.findViewById(R.id.shelf_item_image);
            convertView.setTag(holder);
        } else {
            holder = (SubViewHolder)convertView.getTag();
        }

        if(position >= getSubItemsCount()){
            holder.img.setImageBitmap(null);
            return convertView;
        }

        item = getItem(position);
        PATH = item.getFile().getAbsolutePath();
        Bitmap preview = item.getPreviewFromSD();
        if(preview != null){
            holder.img.setImageBitmap(preview);
        } else {
            holder.img.setImageResource(R.drawable.ic_launcher);
            LoadPreviewTask task = taskPool.get(holder.hashCode());
            if (task != null) {
                task.cancel(true);
                taskPool.remove(holder.hashCode());
                task = null;
            }
            task = new LoadPreviewTask(holder, rowHeight);
            taskPool.put(holder.hashCode(), task);
            task.execute(item);
        }

        holder.img.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                final ShelfItem si = items.get(position);
                /*Toast.makeText(context, "Item #" + position+"\n"+si.getFile().getAbsolutePath(), Toast.LENGTH_SHORT).show();
                */

                final CharSequence[] items = {"View", "Delete"};
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setTitle("Please choose:");
                builder.setItems(items, new DialogInterface.OnClickListener() {
                    //Toast.makeText(getApplicationContext(), ""+items[0], Toast.LENGTH_SHORT).show();
                    public void onClick(DialogInterface dialog, int index) {
                        if(index == 0){
                            Intent intent = new Intent(Intent.ACTION_VIEW);
                            intent.setDataAndType(Uri.fromFile(si.getFile()),"application/pdf");
                            intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                            context.startActivity(intent);
                        }else if(index == 1){
                                     File file = new File(si.getFile().getAbsoluteFile().toString());
                                     boolean deleteStatus = file.delete();
                                     if(deleteStatus){
                                         Toast.makeText(context, "Deleted Successfully...", Toast.LENGTH_SHORT).show(); 
                                         Intent in = new Intent(context, MainActivity.class);
                                         context.startActivity(in);

                                     }else{
                                         Toast.makeText(context, "Unable to delete...", Toast.LENGTH_SHORT).show();
                                     }
                        }
                    }
                });
                AlertDialog alert = builder.create();
                alert.show();

            }
        });
        return convertView;
    }

    private int getSubPosition(int listItemPosition, int offset){
        return listItemPosition * getRowCount() + offset;
    }

    private LinearLayout.LayoutParams getSubViewParams(){
        LinearLayout.LayoutParams p = new LayoutParams(0, LayoutParams.MATCH_PARENT);
        p.weight = 1f;
        return p;
    }

    private int getRowCount() {
        return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT 
                ? rowCount : rowCountLand;
    }

    private static class ViewHolder{
        public ArrayList<View> subViews;

        public ViewHolder() {
            this.subViews = new ArrayList<View>();
        }
    }

    private static class SubViewHolder{
        public ImageView img;
    }

    private class LoadPreviewTask extends AsyncTask<ShelfItem, Void, Bitmap>{
        private SubViewHolder holder;
        private int rowHeight;

        public LoadPreviewTask(SubViewHolder holder, int rowHeight) {
            super();
            this.holder = holder;
            this.rowHeight = rowHeight;
        }

        @Override
        protected Bitmap doInBackground(ShelfItem... params) {
            ShelfItem item = (ShelfItem)params[0];
            Bitmap preview = item.getPreview(rowHeight);
            item.savePreview(preview);
            return preview;
        }

        @Override
        protected void onPostExecute(final Bitmap result) {
            if(isCancelled()){
               holder = null;
               return;
            }
            holder.img.setImageBitmap(result);
            taskPool.remove(holder.hashCode());
        }
    }

}

我还是Android的新手,所以请不要评判,任何帮助将不胜感激

提前致谢

1 个答案:

答案 0 :(得分:0)

<{>} items在调用null时为getSubItemsCount()

public int getSubItemsCount(){
    return items.size();
}

它从未被初始化!

private ArrayList<ShelfItem> items;
...
public ShelfAdapter(Book book, String targetDirectory) {
    // TODO Auto-generated constructor stub
}

修复是在构造函数中初始化它。

public ShelfAdapter(Book book, String targetDirectory) {
    items = new ArrayList<ShelfItem>();
    // Whatever else you need to do
}