В Tablayout. Не удалось показать Recyclerview внутри фрагмента - PullRequest
0 голосов
/ 18 октября 2019

У меня есть проект о категориях продуктов питания и партии продуктов внутри одной категории.

Вот пример моего проекта

https://i.stack.imgur.com/pHzFp.jpg

  1. Во-первых: я хочу создать локальную базу данных с двумя таблицами (категория, элементы) и добавить в нее данные.
  2. Seconed: у меня есть Tablayout, я получу его имена из категориитаблица.
  3. В-третьих: у Viewpager будет Fragment.
  4. Foutrh: у фрагмента есть Recycler View, который содержит элементы из таблицы Items.
  5. fianlly: когда я провожу пальцем между вкладками, содержимое Recyclerview будет изменено и отобразятся зависимости от category_id.

Моя проблема: Категории и элементы добавлены успешно, но когда я открываю Main Activity проект остановлен.

Основной класс деятельности

public class MainActivity extends AppCompatActivity implements Item_FragmentActivity.OnFragmentInteractionListener{
    TabLayout tab ;
    ViewPager viewPager ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final DatabaseHelper db = new DatabaseHelper(this);
        tab=findViewById(R.id.tab);
        viewPager = findViewById(R.id.viewpager);


        ArrayList<Tabs> tabs = new ArrayList<>();
        for (int i = 1 ; i<db.getAll_Category().size();i++){
            tabs.add(new Tabs(db.getCategoryTitle_ById(i),new Item_FragmentActivity()));
            Tab_Adapter adapter = new Tab_Adapter(getSupportFragmentManager(),tabs);
            viewPager.setAdapter(adapter);
            tab.setupWithViewPager(viewPager);
            tab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {

                }

                @Override
                public void onTabUnselected(TabLayout.Tab tab) {

                }

                @Override
                public void onTabReselected(TabLayout.Tab tab) {

                }
            });


        }
    }


    @Override
    public void onFragmentInteraction(Item item) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        Item_FragmentActivity f = Item_FragmentActivity.newInstance(item.getName(), item.getDescription(), item.getPrice(),item.getItem_img());
        ft.replace(R.id.viewpager,f);
        ft.commit();

    }
}

Элемент Адаптер Recyclerview

public class Items_Recycler_Adapter extends RecyclerView.Adapter<Items_Recycler_Adapter.ItemViewHolder> {

   OnItemClickListener  listener;
     DatabaseHelper db ;
    ArrayList<Item> items ;


    public Items_Recycler_Adapter( ArrayList<Item> items,OnItemClickListener listener) {
        this.listener = listener;
        this.items = db.getAll_items();
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_design,parent,false);
        ItemViewHolder holder = new ItemViewHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {

        Item i = items.get(position);
        holder.bind(i);
    }

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


    class ItemViewHolder extends RecyclerView.ViewHolder{
        TextView item_name, item_descr,item_price;
        ImageView item_img;
        Item item;
        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            item_descr = itemView.findViewById(R.id.item_descr);
            item_name = itemView.findViewById(R.id.item_name);
            item_price = itemView.findViewById(R.id.item_price);
            item_img = itemView.findViewById(R.id.item_img);}

        public void bind(Item item){
            this.item=item;
            item_name.setText(item.getName());
            item_descr.setText(item.getDescription());
            item_price.setText(item.getPrice()+"");
            item_img.setImageResource(item.getItem_img());
        }
        }
    interface OnItemClickListener{
        void ItemClick(Item item);


}}


Фрагмент предмета

public class Item_FragmentActivity extends Fragment {
    private OnFragmentInteractionListener mListener;
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ITEM_NAME = "name";
    private static final String ITEM_DESC = "desc";
    private static final String ITEM_PRICE = "price";
    private static final String ITEM_IMG = "img";

    // TODO: Rename and change types of parameters
     String name;
     String desc;
     double price;
     int img;
     DatabaseHelper db ;



    public Item_FragmentActivity() {

    }

    public static Item_FragmentActivity newInstance(String name , String desc , double price , int img) {
        Bundle args = new Bundle();
        Item_FragmentActivity fragment = new Item_FragmentActivity();
        fragment.setArguments(args);
        args.putString(ITEM_NAME, name);
        args.putString(ITEM_DESC, desc);
        args.putInt(ITEM_IMG, img);
        args.putDouble(ITEM_PRICE, price);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            name = getArguments().getString(ITEM_NAME);
            desc = getArguments().getString(ITEM_DESC);
            price = getArguments().getDouble(ITEM_PRICE);
            img = getArguments().getInt(ITEM_IMG);
        }
    }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_item_, container, false);
        RecyclerView rv = v.findViewById(R.id.item_recycler);
        ArrayList<Item> items = db.getAll_items();

        Items_Recycler_Adapter adapter = new Items_Recycler_Adapter(items, new Items_Recycler_Adapter.OnItemClickListener() {
            @Override
            public void ItemClick(Item item) {
                mListener.onFragmentInteraction(item);
            }
        });
        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(getActivity()));
        rv.setHasFixedSize(true);
        return v;


    }



    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Item item);
    }

}

Класс помощника Databsae

public class DatabaseHelper extends SQLiteOpenHelper {
    SQLiteDatabase db;

    public DatabaseHelper(@Nullable Context context ) {
        super(context, "food_db", null, 1);
        db= getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(Category.Create_table);
        db.execSQL(Item.Create_table);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table " + Category.Table_Name);
        db.execSQL("drop table " + Item.Table_Name);
        onCreate(db);

    }
    public  boolean insert_category ( String title ){
        ContentValues data = new ContentValues();
        data.put(Category.Col_TITLE,title);
        return db.insert(Category.Table_Name,null ,data) >0 ;
    }
    public  boolean insert_item (String name , String description , double price,int item_img,int id_category){

        ContentValues data = new ContentValues();
        data.put(Item.Col_Name,name);
        data.put(Item.Col_Description,description);
        data.put(Item.Col_Price,price);
        data.put(Item.Col_Img,item_img);
        data.put(Item.Col_Id_Category,id_category);

        return db.insert(Item.Table_Name,null ,data) >0 ;
    }
    public ArrayList<Category> getAll_Category(){
        ArrayList<Category> categories=new ArrayList<>();
        Cursor cursor = db.rawQuery("select * from " +Category.Table_Name  ,null);

        while(cursor.moveToNext()){
            int id = cursor.getInt(cursor.getColumnIndex(Category.Col_Id));
            String title = cursor.getString(cursor.getColumnIndex(Category.Col_TITLE));
            Category c = new Category(id,title);
            categories.add(c);


        }
        cursor.close();
        return categories;
    }
    public ArrayList<Item> getAll_items(){

        Cursor cursor = db.rawQuery(" select * from " + Item.Table_Name ,null);
        ArrayList<Item> items=new ArrayList<>();

        while (cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex(Item.Col_Id));
            String name =cursor.getString(cursor.getColumnIndex(Item.Col_Name));
            String desc =cursor.getString(cursor.getColumnIndex(Item.Col_Description));
            double price =cursor.getDouble(cursor.getColumnIndex(Item.Col_Price));
            int img =cursor.getInt(cursor.getColumnIndex(Item.Col_Img));
            int category_id =cursor.getInt(cursor.getColumnIndex(Item.Col_Id_Category));
            Item i =new Item(id,name,desc,price,img,category_id);
            items.add(i);

        }
        cursor.close();
        return items;
    }
    public String getCategoryTitle_ById(int id) {
        Cursor cursor = db.rawQuery("select title from " + Category.Table_Name + " where id=" + id, null);
        cursor.moveToFirst();
        return cursor.getString(cursor.getColumnIndex(Category.Col_TITLE));
    }
    public ArrayList<String> getCategoryTitle_withOutId() {
        Cursor cursor = db.rawQuery("select title from " + Category.Table_Name , null);
          ArrayList<String> categories=new ArrayList<>();
            while (cursor.moveToNext()){

                String title =cursor.getString(cursor.getColumnIndex(Category.Col_TITLE));

                categories.add(title);

            }
            cursor.close();
            return categories;
        }
    public ArrayList<Item> show_item_by_categoryId(int Id){
        Cursor cursor = db.rawQuery("select * from " + Item.Table_Name + " where " + Item.Col_Id_Category +" like " + Category.Col_Id, null);
        ArrayList<Item> items=new ArrayList<>();
        while (cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex(Item.Col_Id));
            String Name =cursor.getString(cursor.getColumnIndex(Item.Col_Name));
            String Desc =cursor.getString(cursor.getColumnIndex(Item.Col_Description));
            double Price =cursor.getDouble(cursor.getColumnIndex(Item.Col_Price));
            int Img =cursor.getInt(cursor.getColumnIndex(Item.Col_Img));
            int category_id =cursor.getInt(cursor.getColumnIndex(Item.Col_Id_Category));
            Item c =new Item(id,Name,Desc,Price,Img,category_id);
            items.add(c);

        }
        cursor.close();
        return items;
    }
}

вкладка adaper

public class Tab_Adapter extends FragmentStatePagerAdapter {

     DatabaseHelper db ;
    ArrayList<Tabs> tabs ;

    public Tab_Adapter(@NonNull FragmentManager fm, ArrayList<Tabs> tabs) {
        super(fm);
        this.tabs = tabs;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return tabs.get(position).getFragment();
    }

    @Override
    public int getCount() {
        return tabs.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return tabs.get(position).getTitle();
    }
}


...