1

So, for a personal project I'm making a stream app for Android which are separated by three fragments in the main screen where each of those fragment will be a list of a type of show in our archive, like movies, TV series and animations by using a RecyclerView inside of them.

That being said, after some errors that I managed to fix, the app is not showing what was expected, by skipping the RecyclerView because it has no "adapter".

Here is the code so far:

The main activity:

public class MenuPrincipal extends AppCompatActivity {

    @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu_principal);

        AbasMenuPrincipalAdapter adapter = new AbasMenuPrincipalAdapter( getSupportFragmentManager() );
        adapter.adicionar( new FilmesFragment() , "Filmes");
        adapter.adicionar( new SeriesFragment() , "Series");
        adapter.adicionar( new AnimacoesFragment() , "Animações");


        ViewPager viewPager = (ViewPager) findViewById(R.id.abas_view_pager);
        viewPager.setAdapter(adapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.abas);
        tabLayout.setupWithViewPager(viewPager);

    }
}

One of the fragments used on the main screen:

public class AnimacoesFragment extends Fragment {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    ArrayList<Item> exemploItemList = new ArrayList<Item>();

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

        View view = inflater.inflate(R.layout.animacoes_fragment, container, false);

        TextView tv = view.findViewById(R.id.text1);
        tv.setText("Você está na terceira aba");

        exemploItemList.add(new Item(R.drawable.ic_android, "Line1", "line2"));
        exemploItemList.add(new Item(R.drawable.ic_desktop_mac, "Line2", "line3"));
        exemploItemList.add(new Item(R.drawable.ic_laptop_windows, "Line4", "line5"));

        mRecyclerView = (RecyclerView) view.findViewById(R.id.AnimacaoRecyclerView);

        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(llm);
        ItemAdapter adapter = new ItemAdapter(exemploItemList);
        mAdapter = adapter;
        mRecyclerView.setAdapter(mAdapter);

        return view;
    }
}

And its layout:

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

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/AnimacaoRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="4dp"
        android:scrollbars="vertical" />

</LinearLayout>

This is what I'm trying to show on that RecyclerView (later will be the real thing, now it's just a test):

public class Item {
    private int mImageResource;
    private String text1;
    private String text2;

    public Item(int mImageResource, String text1, String text2) {
        this.mImageResource = mImageResource;
        this.text1 = text1;
        this.text2 = text2;
    }
    public int getmImageResource() {
        return mImageResource;
    }
    public void setmImageResource(int mImageResource) {
        this.mImageResource = mImageResource;
    }
    public String getText1() {
        return text1;
    }
    public void setText1(String text1) {
        this.text1 = text1;
    }
    public String getText2() {
        return text2;
    }
    public void setText2(String text2) {
        this.text2 = text2;
    }
}

It's layout:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardCornerRadius="4dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="4dp">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:contentDescription="@string/imagem"
        android:padding="2dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="50dp"
        android:layout_marginTop="0dp"
        android:text="@string/line1"
            android:textColor="#000000"
            android:textSize="20sp"
            android:textStyle="bold"
            android:id="@+id/textView"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="50dp"
            android:layout_marginTop="28dp"
            android:text="@string/line2"
            android:textSize="15sp"
            android:textStyle="bold"
            android:id="@+id/textView2"/>
    </RelativeLayout>
</androidx.cardview.widget.CardView>

Finally, the adapter used to convert the list:

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

    private ArrayList<Item> mItemList;

    public static class ItemViewHolder extends RecyclerView.ViewHolder{
        public ImageView mImageView;
        public TextView mTextView1;
        public TextView mTextView2;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            mImageView = itemView.findViewById(R.id.imageView);
            mTextView1 = itemView.findViewById(R.id.textView);
            mTextView2 = itemView.findViewById(R.id.textView2);

        }
    }

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

    public ItemAdapter(ArrayList<Item> itemList){
        mItemList = itemList;
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        Item currentItem = mItemList.get(position);

        holder.mImageView.setImageResource(currentItem.getmImageResource());
        holder.mTextView1.setText(currentItem.getText1());
        holder.mTextView2.setText(currentItem.getText2());
    }

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

1 Answers1

1

First of all, check your fragment layout file. The linear layout parent orientation set to 'horizontal' and width of it's child views ('textview' & 'recyclerview') is match parent. This won't work. Try to initialize your recyclerview adapter in 'onCreate' and use 'notifyDataSetChanged()' after setting up the adapter with recyclerview.