RecyclerView на вкладке не отображаются элементы - PullRequest
0 голосов
/ 23 мая 2018

При создании заголовка мне предлагались похожие вопросы.Я посмотрел на них все, но я не нашел ответ, который искал, поэтому здесь я иду.

У меня есть фрагмент «Планирование», который будет содержать различные фрагменты.Он будет иметь TabLayout с тремя вкладками, использующими один и тот же ListFragment с именем «PlanningListItemFragment».

В нем будет храниться окно повторного просмотра, в котором будут добавлены элементы с использованием «PlanningItemFragment» и адаптера «RecyclerViewAdapter».

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

Фрагмент планирования:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_planning,
                container, false);
        final Button chooseDate = (Button)view.findViewById(R.id.chooseDate);

        // Code for setting the date with calendar
        chooseDate.setOnClickListener(new View.OnClickListener() {
                                      @Override
                                      public void onClick(View v) {

                                        DialogFragment datePicker = new DatePickerFragment();
                                        datePicker.show(getChildFragmentManager(), "date picker");

                                      }
                                      });

        //code for the tablayout

        tabLayout = (TabLayout)view.findViewById(R.id.planning_tabs);
        viewPager = (ViewPager)view.findViewById(R.id.viewpager);
        FragmentManager cfManager = getChildFragmentManager();
        adapter = new ViewPagerAdapter(cfManager);

        // add Fragment Here

        adapter.addFragment(new PlanningListItemFragment(),"Breakfast");
        adapter.addFragment(new PlanningListItemFragment(),"Lunch");
        adapter.addFragment(new PlanningListItemFragment(),"Dinner");
        // set Icons to tabs

        // tablayout.getTabAt(0).setIcon(R.drawable.X1):
        // tablayout.getTabAt(1).setIcon(R.drawable.X2):
        // tablayout.getTabAt(2).setIcon(R.drawable.X3):

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);

        // remove shadow from the action bar
        // ActionBar actionBar = getSupportActionbar();
        // actionBar.setElevation(0);


        return view;
    }

Как вы можете видеть, он имеет 3 вкладки.

PlanningListItemFragment:

public class PlanningListItemFragment extends Fragment {

    View v;
    private RecyclerView mrecyclerview;
    private List<PlanningItemFragment> lstPlanningItem;

    public PlanningListItemFragment() {

    }

    @Nullable
    //@Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.fragment_planning_list, container, false);
        mrecyclerview = v.findViewById(R.id.RCview);
        RecyclerViewAdapter recyclerAdapter = new RecyclerViewAdapter(getContext(),lstPlanningItem);
        mrecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
        mrecyclerview.setAdapter(recyclerAdapter);
        Log.d("debugMode", "The onCreateView method has been launched");
        return v;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // TODO: 22/05/2018 Implement the call to get the meal picture from the database

        lstPlanningItem = new ArrayList<>();
        lstPlanningItem.add(new PlanningItemFragment("Menu A", "keywords", R.drawable.ic_nav_ic_meal));




    }
}

log.d показывает, что метод OnCreateView вызывается правильно.

FragmentPlanningList.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <android.support.v7.widget.RecyclerView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/RCview">


    </android.support.v7.widget.RecyclerView>


</LinearLayout>

PlanningItemFragment:

public class PlanningItemFragment {

    private String Name;
    private String Keywords;
    private int Photo;


    public PlanningItemFragment(String name, String keywords, int photo) {
        Name = name;
        Keywords = keywords;
        Photo = photo;
    }

    // getter

    public String getName(){
        return Name;
    }

    public String getKeywords(){
        return Keywords;
    }

    public int getPhoto() {
        return Photo;
    }

Item_Planning xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/img_meal"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginLeft="16dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:text="Item Name"
            android:id="@+id/item_name"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="Key words"
            android:id="@+id/keywords"/>
    </LinearLayout>



</LinearLayout>

RecyclerViewAdapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

Context mContext ;
List<PlanningItemFragment> mData;

    public RecyclerViewAdapter(Context mContext, List<PlanningItemFragment> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v ;
        v = LayoutInflater.from(mContext).inflate(R.layout.item_planning,parent,false);
        ViewHolder vHolder = new ViewHolder(v);
        return vHolder;
    }

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

        holder.tv_name.setText(mData.get(position).getName());
        holder.tv_keywords.setText(mData.get(position).getKeywords());
        holder.img_photo.setImageResource(mData.get(position).getPhoto());
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_name;
        private TextView tv_keywords;
        private ImageView img_photo;

        public ViewHolder(View itemView) {
            super(itemView);

            tv_name = itemView.findViewById(R.id.item_name);
            tv_keywords =  itemView.findViewById(R.id.keywords);
            img_photo = itemView.findViewById(R.id.img_meal);

        }
    }



}

Планирование XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    tools:context=".Fragments.planning">


    <Button
        android:id="@+id/chooseDate"
        style="@style/Widget.AppCompat.Button.Borderless.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="5dp"
        android:elevation="0dp"
        android:hint="Tap to select a date!"
        android:textColorHint="@color/blue"

        android:textSize="20sp" />

    <TextView
        android:id="@+id/dateGiven"
        android:textAlignment="center"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:textColor="@color/blue" />

    <android.support.v7.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="match_parent">



    <android.support.design.widget.TabLayout
        android:id="@+id/planning_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"
        app:tabTextColor="@color/blue"
        app:tabSelectedTextColor="@color/blue"
        />

    <android.support.v4.view.ViewPager
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:id="@+id/viewpager">


    </android.support.v4.view.ViewPager>
    </android.support.v7.widget.LinearLayoutCompat>

</LinearLayout>

Большинство проблем, обнаруженных на этом сайте, были связаны с getItemCount (), возвращающим 0. Но этоздесь дело не в этом.

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

(у меня недостаточно кредитов, чтобы комментировать)

Можете ли вы записать размер списка lstPlanningItem перед настройкой адаптера?Смотрите, если его ноль.Попробуйте раскомментировать @Override для onCreateView и переместите часть инициализации и обновления списка в onCreateView (),

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.fragment_planning_list, container, false);
    lstPlanningItem = new ArrayList<>();

    mrecyclerview = v.findViewById(R.id.RCview);
    RecyclerViewAdapter recyclerAdapter = new RecyclerViewAdapter(getActivity(),lstPlanningItem);
    mrecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
    mrecyclerview.setAdapter(recyclerAdapter);

    lstPlanningItem.add(new PlanningItemFragment("Menu A", "keywords", R.drawable.ic_nav_ic_meal));
    Log.wtf("size_of_my_list", Integer.toString(lstPlanningItem.size()));
    recyclerAdapter.notifydatasetchanged();
    Log.d("debugMode", "The onCreateView method has been launched");
    return v;
}
0 голосов
/ 24 мая 2018

Как сказал Майк М, это был ответ:

Внутренний LinearLayoutCompat в макете «Planning XML» не имеет указанной ориентации, поэтому он горизонтальный.Поскольку layout_width для TabLayout равен match_parent, ViewPager выталкивается за пределы экрана.Вы можете указать вертикальную ориентацию этого LinearLayoutCompat или просто удалить его, так как корневой LinearLayout уже вертикальный, и LinearLayoutCompat на самом деле не нужен

Большое вам спасибо!

0 голосов
/ 23 мая 2018

@ jonamar, пожалуйста, попробуйте обновить эту строку,

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

mrecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));

с

LinearLayoutManager llm= new LinearLayoutManager(getActivity());
mrecyclerview.setLayoutManager(llm);
...