@Johnny_Bravo

Почему recyclerview не отображается в фрагменте, но работает в Активити?

recyclerview не отображается в фрагменте, просто пустой фрагмент. Хотя в обычном активити все работает, данные загружаются с БД в логе выводиться, что данные добавлены, но в фрагменте не отображаются..

spoiler
public class Income extends Fragment implements View.OnClickListener {
 MyDatabaseHelper myDB;
    TextView no_data;
    ImageView empty_imageview;
    Float translationY = 100f;
    Boolean isMenuOpen = false;
    OvershootInterpolator interpolator = new OvershootInterpolator();
    private RecyclerView mRecyclerView;
    CustomAdapter customAdapter;
    ArrayList<String> id_txt,textName,textIncome,textExpenses,textTotal, textDate;
    FloatingActionButton fab_menu, fab_reset, fab_scan, fab_add;
    Activity activity;
    Context context;



    public Income() {


    }


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = LayoutInflater.from(container.getContext()).inflate(R.layout.income_fragment, container, false);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.income_recyclerview);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(new CustomAdapter(getActivity(),getContext(),id_txt, textName, textIncome,
               textExpenses,textTotal,textDate));

        fab_menu = view.findViewById(R.id.fab_menu);
        fab_scan = view.findViewById(R.id.fab_scan);
        fab_reset = view.findViewById(R.id.fab_reset);
        fab_add = view.findViewById(R.id.fab_add);

        loadData();

        initFabMenu();

        return view;


    }
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.fab_menu:
                    if (isMenuOpen) {
                        closeMenu();
                    } else {
                        openMenu();
                    }
                    break;
                case R.id.fab_scan:
                    startActivity(new Intent(getActivity(), ScanActivity.class));
                    break;
                case R.id.fab_add:
                    startActivity(new Intent(getActivity(),AddActivity.class));
                    break;
            }
    }

    private void initFabMenu(){

        fab_scan.setAlpha(0f);
        fab_reset.setAlpha(0f);
        fab_add.setAlpha(0f);

        fab_menu.setOnClickListener(this);
        fab_scan.setOnClickListener(this);
        fab_reset.setOnClickListener(this);
        fab_add.setOnClickListener(this);

        fab_scan.setTranslationY(translationY);
        fab_reset.setTranslationY(translationY);
        fab_add.setTranslationY(translationY);

    }

    private void openMenu(){
        isMenuOpen = !isMenuOpen;

        fab_menu.animate().setInterpolator(interpolator).rotationBy(45f).setDuration(300).start();

        fab_scan.animate().translationY(0f).alpha(1f).setInterpolator(interpolator).setDuration(300).start();
        fab_reset.animate().translationY(0f).alpha(1f).setInterpolator(interpolator).setDuration(300).start();
        fab_add.animate().translationY(0f).alpha(1f).setInterpolator(interpolator).setDuration(300).start();
    }

    private void closeMenu(){
        isMenuOpen = !isMenuOpen;

        fab_menu.animate().setInterpolator(interpolator).rotationBy(0f).setDuration(300).start();


        fab_scan.animate().translationY(translationY).alpha(0f).setInterpolator(interpolator).setDuration(300).start();
        fab_reset.animate().translationY(translationY).alpha(0f).setInterpolator(interpolator).setDuration(300).start();
        fab_add.animate().translationY(translationY).alpha(0f).setInterpolator(interpolator).setDuration(300).start();


    }

    private void initNoDataView(){
      empty_imageview = view.findViewById(R.id.empty_imageview);
      no_data = view.findViewById(R.id.no_data);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1){
            recreate();
        }
    }

    private void recreate() {
    }

    private void storeDataInArrays() {
       Cursor cursor = myDB.readAllData();
       if (cursor.getCount() == 0) {
            empty_imageview.setVisibility(View.VISIBLE);
            no_data.setVisibility(View.VISIBLE);
       } else {
           while (cursor.moveToNext()) {
               id_txt.add(cursor.getString(0));
               textName.add(cursor.getString(1));
               textIncome.add(cursor.getString(2));
               textDate.add(cursor.getString(3));
           }
           empty_imageview.setVisibility(View.GONE);
           no_data.setVisibility(View.GONE);
       }
   }

   private void loadData(){
       myDB = new MyDatabaseHelper(getContext());
       //myDB = new MyDatabaseHelper(MainActivity.this);

       id_txt = new ArrayList<>();
       textName = new ArrayList<>();
       textIncome = new ArrayList<>();
       textExpenses = new ArrayList<>();
       textTotal = new ArrayList<>();
       textDate = new ArrayList<>();
   }
}


public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

    private Context context;
    private Activity activity;
    private ArrayList id_txt, textName, textIncome, textExpenses,textTotal, textDate;




    public CustomAdapter(Activity activity, Context context,ArrayList<String> id_txt, ArrayList<String> textName,
                         ArrayList<String> textIncome, ArrayList<String> textExpenses,
                         ArrayList<String> textTotal, ArrayList<String> textDate) {
        this.activity = activity;
        this.context = context;
        this.id_txt = id_txt;
        this.textName = textName;
        this.textIncome = textIncome;
        this.textExpenses = textExpenses;
        this.textTotal = textTotal;
        this.textDate = textDate;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.my_row, parent, false);
        return new MyViewHolder(view);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.id_txt.setText(String.valueOf(id_txt.get(position)));
        holder.textName.setText(String.valueOf(textName.get(position)));
        holder.textIncome.setText(String.valueOf(textIncome.get(position)));
        holder.textExpenses.setText(String.valueOf(textExpenses.get(position)));
        holder.textTotal.setText(String.valueOf(textTotal.get(position)));
        holder.textDate.setText(String.valueOf(textDate.get(position)));
        //Recyclerview onClickListener
        holder.mainLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, UpdateActivity.class);
                intent.putExtra("id", String.valueOf(id_txt.get(position)));
                intent.putExtra("name", String.valueOf(textName.get(position)));
                intent.putExtra("income", String.valueOf(textIncome.get(position)));
                intent.putExtra("expenses", String.valueOf(textExpenses.get(position)));
                intent.putExtra("total", String.valueOf(textTotal.get(position)));
                intent.putExtra("date", String.valueOf(textDate.get(position)));
                activity.startActivityForResult(intent, 1);
            }
        });


    }

    @Override
    public int getItemCount() {
//        return id_txt.size();
        return (id_txt == null) ? 0: id_txt.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView id_txt, textName, textIncome, textExpenses,textTotal,textDate;
        LinearLayout mainLayout;

        MyViewHolder(@NonNull View itemView) {
            super(itemView);
            id_txt = itemView.findViewById(R.id.id_txt);
            textName = itemView.findViewById(R.id.textName);
            textIncome = itemView.findViewById(R.id.textIncome);
            textExpenses = itemView.findViewById(R.id.textExpenses);
            textTotal = itemView.findViewById(R.id.textTotal);
            mainLayout = itemView.findViewById(R.id.mainLayout);
            textDate = itemView.findViewById(R.id.textDate);
            //Animate Recyclerview
            Animation translate_anim = AnimationUtils.loadAnimation(context, R.anim.translate_anim);
            mainLayout.setAnimation(translate_anim);
        }

    }

}
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 3
alekseyHunter
@alekseyHunter
Android developer
Отладчиком пробегись и посмотри, что возвращает БД и почему не грузятся данные в адапторе.
Ответ написан
VictorPower
@VictorPower
Тоже с подобным сейчас работаю. У меня все реализовано так:
spoiler

onCreateView во фрагменте:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.main_fragment, container, false);  // main_fragment - файл разметки фрагмента
        RecyclerView recyclerView = rootView.findViewById(R.id.list);
        DataAdapter mAdapter = new DataAdapter();  // DataAdapter - адаптер для получения данных
        recyclerView.setAdapter(mAdapter);
        recyclerView.setItemAnimator(new DefaultItemAnimator()); //необязательная строка, без нее тоже все работает

        return rootView;
    }

В разметке фрагмента RecyclerView вписан так:
<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="LinearLayoutManager">

    </androidx.recyclerview.widget.RecyclerView>


Попробуйте сравнить с моей реализацией.
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
storeDataInArrays нигде не вызывается.
loadData по факту ничего не делает.
notify* методы у адаптера не вызываются.
В общем дело не во фрагменте, а в том, что код не дописан.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы