Listview里面的片段

时间:2017-10-24 14:51:58

标签: android listview android-fragments

我正在Android中创建一个书籍应用程序,我正在尝试在片段中创建一个Listview以显示书籍列表。我正在从Google电子表格中获取图书信息。

我有一本书课:

package com.example.app_tfg;

import android.graphics.drawable.Drawable;

/**
 * Clase Book. Contiene un campo para el título y otro para la portada del libro.
 */

public class Book {
    static String title;
    static Drawable cover;

    public Book(){
        super();
    }

    public Book(String title, Drawable cover){
        super();
        this.title = title;
        this.cover = cover;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title){
        this.title = title;
    }

    public Drawable getCover() {
        return cover;
    }

    public void setCover(Drawable cover) {
        this.cover = cover;
    }

}

该片段如下:

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

import static com.example.app_tfg.Spreadsheets.read_only;


public class MiEstanteria extends Fragment  {
    static String read = "si";
    ListView bookList;
    Book book_data[];

    public MiEstanteria() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment_mi_estanteria, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        Intent intent = new Intent(getActivity(), Spreadsheets.class);
        intent.putExtra(read_only,read);
        startActivity(intent);

        BookAdapter bookAdapter = new BookAdapter(getActivity(),R.layout.fila_lista_miestanteria,book_data);
        bookList = (ListView) bookList.findViewById(R.id.book_list);
        bookList.setAdapter(bookAdapter);

        bookList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                //Aquí Book_info
            }
        });
    }
}    

我还有一个BookAdapter类:

package com.example.app_tfg;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Clase BookAdapter
 */

public class BookAdapter extends ArrayAdapter <Book> {
    private Context context;
    int layout;
    Book data[] = null;

    public BookAdapter (Context context, int layout, Book data[]) {
        super(context, layout, data);
        this.context = context;
        this.layout = layout;
        this.data = data;
    }

    //Creo la vista
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        BookHolder holder;

        if(row == null){
            LayoutInflater inflater = LayoutInflater.from(context);
            row = inflater.inflate(layout,parent,false);

            holder = new BookHolder();
            holder.cover = (ImageView) row.findViewById(R.id.book_cover);
            holder.title = (TextView) row.findViewById(R.id.book_title);
            row.setTag(holder);
        }
        else {
            holder = (BookHolder) row.getTag();
        }

        Book book = data[position];
        holder.title.setText(Book.title);
        holder.cover.setImageDrawable(Book.cover);

        return row;
    }

    static class BookHolder{
        ImageView cover;
        TextView title;

    }
}

我得到的错误如下:     V / BoostFramework:BoostFramework():mPerf = com.qualcomm.qti.Performance@41edcd7     D / AndroidRuntime:关闭VM

                  --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.app_tfg, PID: 19179
                  java.lang.NullPointerException
                      at java.util.Objects.requireNonNull(Objects.java:203)
                      at java.util.Arrays$ArrayList.<init>(Arrays.java:3826)
                      at java.util.Arrays.asList(Arrays.java:3813)
                      at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:139)
                      at com.example.app_tfg.BookAdapter.<init>(BookAdapter.java:0)
                      at com.example.app_tfg.MiEstanteria.onCreate(MiEstanteria.java:45)
                      at android.support.v4.app.Fragment.performCreate(Fragment.java:2177)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1244)
                      at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1080)
                      at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:971)
                      at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:95)
                      at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2143)
                      at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)
                      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.
你能帮我吗?非常感谢你!!

1 个答案:

答案 0 :(得分:0)

try this


public class MiEstanteria extends Fragment  {
    static String read = "si";
    ListView bookList;
    Book book_data[]= new Book[0];
    BookAdapter bookAdapter;

    public MiEstanteria() {
        Required empty public constructor
    }

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_mi_estanteria,container, false);
        bookList = (ListView) v.findViewById(R.id.book_list);
        bookList.setAdapter(bookAdapter);
        bookList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                //Aquí Book_info
            }
        });
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        bookAdapter = new BookAdapter(getActivity(),R.layout.fila_lista_miestanteria,book_data);
    }}