У меня есть проект о категориях продуктов питания и партии продуктов внутри одной категории.
Вот пример моего проекта
https://i.stack.imgur.com/pHzFp.jpg
- Во-первых: я хочу создать локальную базу данных с двумя таблицами (категория, элементы) и добавить в нее данные.
- Seconed: у меня есть Tablayout, я получу его имена из категориитаблица.
- В-третьих: у Viewpager будет Fragment.
- Foutrh: у фрагмента есть Recycler View, который содержит элементы из таблицы Items.
- 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();
}
}