2015-08-17 4 views
1

Сначала мой recyclerview работает плавно с нуля без ViewPager. Но когда я пытаюсь добавить мой recyclerview в свой адаптер ViewPager, он падает, и он говорит, что ошибка находится в помощнике базы данных в getAllData(). TY заранее. надеюсь кто-то может помочь мне понять это.RecyclerView on viewPager crashes

Это мой код.

FragmentMeal.java

package inncharge.poy.madrigal.innchargev1.fragments; 


import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import inncharge.poy.madrigal.innchargev1.R; 
import inncharge.poy.madrigal.innchargev1.activities.DatabaseHelper; 
import inncharge.poy.madrigal.innchargev1.adapters.DataBeanAdapter; 
import inncharge.poy.madrigal.innchargev1.pojo.DataBean; 


/** 
* A simple {@link Fragment} subclass. 
* Use the {@link FragmentMeal#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class FragmentMeal extends Fragment { 



    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 
    DatabaseHelper helper = new DatabaseHelper(getActivity()); 
    private RecyclerView mRecyclerView; 


    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment FragmentMeal. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static android.support.v4.app.Fragment newInstance(String param1, String param2) { 
     FragmentMeal fragment = new FragmentMeal(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 

    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_meal, container, false); 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
     mRecyclerView.setAdapter(new DataBeanAdapter(helper.getAllData(), R.layout.item)); 
     return view; 
    } 



} 

DatabaseHelper.java

package inncharge.poy.madrigal.innchargev1.activities; 

    import android.content.ContentValues; 
    import android.content.Context; 
    import android.database.Cursor; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.database.sqlite.SQLiteOpenHelper; 

    import java.util.ArrayList; 
    import java.util.List; 

    import inncharge.poy.madrigal.innchargev1.pojo.DataBean; 

    /** 
    * Created by Madrigal on 8/9/2015. 
    */ 
    public class DatabaseHelper extends SQLiteOpenHelper { 

     private static final int DATABASE_VERSION = 1; 
     private static final String DATABASE_NAME = "contacts.db"; 
     private static final String TABLE_NAME = "contacts"; 
     private static final String UID = "id"; 
     private static final String NAME = "name"; 
     private static final String CARD = "card"; 
     private static final String CODE = "code"; 
     SQLiteDatabase db; 
     private static final String TABLE_CREATE = "CREATE TABLE contacts (id INTEGER PRIMARY KEY NOT NULL," + 
       "name TEXT NOT NULL , card TEXT NOT NULL, code TEXT NOT NULL)"; 

     public DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(TABLE_CREATE); 
      this.db = db; 
     } 

     public void insertBean(DataBean bean) { 

      db = this.getWritableDatabase(); 
      ContentValues values = new ContentValues(); 

      String query = "SELECT * FROM contacts"; 
      Cursor cursor = db.rawQuery(query, null); 
      int count = cursor.getCount(); 

      values.put(UID, count); 
      values.put(NAME, bean.getName()); 
      values.put(CARD, bean.getCard()); 
      values.put(CODE, bean.getCode()); 

      db.insert(TABLE_NAME, null, values); 
      db.close(); 

     } 

     public List<DataBean> getAllData() { 
      db = this.getWritableDatabase(); 
      String query = "SELECT * FROM contacts"; 
      Cursor cursor = db.rawQuery(query, null); 

      List<DataBean> list = new ArrayList<>(); 

      while (cursor.moveToNext()) { 
       int index = cursor.getColumnIndex(UID); 
       int index2 = cursor.getColumnIndex(NAME); 
       int index3 = cursor.getColumnIndex(CARD); 
       int index4 = cursor.getColumnIndex(CODE); 
       int id = cursor.getInt(index); 
       String name = cursor.getString(index2); 
       String card = cursor.getString(index3); 
       String code = cursor.getString(index4); 
       DataBean bean = new DataBean(); 
       bean.setId(id); 
       bean.setName(name); 
       bean.setCard(card); 
       bean.setCode(code); 
       list.add(bean); 
      } 
      return list; 
     } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     String query = "DROP TABLE IF EXIST"+TABLE_NAME; 
     db.execSQL(query); 
     this.onCreate(db); 
    } 
} 

ViewPagerAdapater

private class ViewPagerAdapter extends FragmentStatePagerAdapter { 

     int icons[] = {R.drawable.ic_action_meal, 
       R.drawable.ic_action_drinks, 
       R.drawable.ic_action_snack}; 

     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     public Fragment getItem(int num) { 

      Fragment fragment = null; 

      switch (num) { 
       case MEAL: 
        fragment = FragmentMeal.newInstance("", ""); 
        break; 
       case DRINKS: 
        fragment = FragmentDrinks.newInstance("", ""); 
        break; 
       case SNACK: 
        fragment = FragmentSnack.newInstance("", ""); 
        break; 
      } 
       return fragment; 
     } 

     @Override 
     public int getCount() { 

      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return getResources().getStringArray(R.array.tabs)[position]; 
     } 

     private Drawable getIcon(int position) { 

      return ResourcesCompat.getDrawable(getResources(), icons[position], null); 

     } 

    } 

адаптер

package inncharge.poy.madrigal.innchargev1.adapters; 

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.List; 

import inncharge.poy.madrigal.innchargev1.R; 
import inncharge.poy.madrigal.innchargev1.pojo.DataBean; 

/** 
* Created by Madrigal on 8/17/2015. 
*/ 
public class DataBeanAdapter extends RecyclerView.Adapter<DataBeanAdapter.ViewHolder>{ 
    private List<DataBean> items; 
    private int itemLayout; 

    public DataBeanAdapter(List<DataBean> items, int itemLayout){ 
     this.items = items; 
     this.itemLayout = itemLayout; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     DataBean item = items.get(position); 
     holder.name.setText(item.getName()); 
     holder.card.setText(item.getCard()); 
     //All the thing you gonna show in the item 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView name; 
     public TextView card; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      name = (TextView) itemView.findViewById(R.id.name); 
      card = (TextView) itemView.findViewById(R.id.card); 
     } 
    } 
} 

Редактировать добавил LogCat от опс комментарий

08-17 17: 17: 26,299 1333-1333 /? Е/AndroidRuntime: неустранимый: Главного java.lang.NullPointerException на android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java: 224) на android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.ja ва: 164) на inncharge.poy.madrigal.innchargev1.activities.DatabaseHelper.getAllData (БД) Helper.java:61 в inncharge.poy.madrigal.innchargev1.fragments.FragmentMeal.onCreateView (FragmentM ОУД. java: 82)

java: 82 ошибка в этом. mRecyclerView.setAdapter (новый DataBeanAdapter (helper.getAllData(), R.layout.item));

lang java: 61 erro это. public list getAllData() {db = this.getWritableDatabase();

TAKE ПРИМЕЧАНИЕ:
, когда я пытаюсь мой взгляд ресайклера без ViewPager он отлично работает, но когда я пытаюсь добавить его в моем взгляде пейджер. Эта ошибка возникает.

+0

И ошибка? – Emil

+0

Опубликуйте свой журнал cat. –

+0

08-17 17: 17: 26,299 1333-1333 /? Е/AndroidRuntime: неустранимый: Главный java.lang.NullPointerException на android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:224) на android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:164) at inncharge.poy.madrigal.innchargev1.activities.DatabaseHelper.getAllData (DatabaseHelper.java:61) at inncharge.poy.madrigal.innchargev1.fragments.FragmentMeal.onCreateView (FragmentMeal.java:82) –

ответ

0

Наконец-то выясните, в чем проблема. проблема заключается в моем помощнике базы данных DatabaseHelper = new DatabaseHelper (getActivity()); .. я должен объявить помощника, как этот private DatabaseHelper db; затем выполните onCreate, как и db = new DatabaseHelper (getActivity()); ..

Проблема заключается в том, что я должен объявить getActivity() после создания фрагмента.

0

movetonext перемещает курсор в следующую строку, isafterlast будет определять, есть ли следующая строка. Кроме того, переместите курсор к первой записи.

http://developer.android.com/reference/android/database/Cursor.html

И попытаться получить значение в индексе столбца в качестве индекса столбца.

Измените свой список и адаптер следующим образом.

в вашем творении.

List items = helper.getAllData(); 
ArrayAdapter adapter = new ArrayAdapter(getActivity(), R.layout.item, 
      R.id.textList, items); 

В вашем классе-помощнике.

public List getAllData() 
    List list = new ArrayList(); 

Измените цикл while следующим образом.

cursor.moveToFirst(); 

while (!cursor.isAfterLast()) { 
    // int index = cursor.getColumnIndex(UID); 
    // int index2 = cursor.getColumnIndex(NAME); 
    // int index3 = cursor.getColumnIndex(CARD); 
    // int index4 = cursor.getColumnIndex(CODE); 
    int id = cursor.getInt(0); 
    String name = cursor.getString(1); 
    String card = cursor.getString(2); 
    String code = cursor.getString(3); 
    DataBean bean = new DataBean(); 
    bean.setId(id); 
    bean.setName(name); 
    bean.setCard(card); 
    bean.setCode(code); 
    list.add(bean); 
    cursor.moveToNext(); 
} 

Я хотел бы также предложить разбивая свою реализацию в цикле, модуляризировать, как он стоит, есть много там происходит.

Edit после обратной связи:

Я не могу видеть, где вы используете ViewPagerAdapter. Который может быть исключением вашего нулевого указателя.

Предлагаю вам посмотреть:
http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html.

Если это не поможет, вернитесь ко мне.

+0

Спасибо за ответ Привет. Я пробую код, который вы публикуете, но он все тот же ошибки. но, как я сказал на мой вопрос выше, когда я пытаюсь использовать recyclerview без viewpager. он работает отлично. но когда я пытаюсь добавить его в свой плейер просмотра. эта ошибка возникает. –

Смежные вопросы