web-dev-qa-db-fra.com

Affichage du recycleur non affiché

J'ai créé une application qui utilise une vue de recycleur dans un tiroir de navigation, comment le contenu de la vue de recycleur ne s'est pas affiché. La vue est définitivement la leur car je peux voir les ombres du défilement. Je ne suis pas sûr de vouloir avoir mal agi car l'application ne plante pas lorsqu'elle est exécutée.

Fragment du tiroir de navigation:

public class NavigationDrawerFragment extends Android.support.v4.app.Fragment {

    public static final String PREF_FILE_NAME = "testPref";
    public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer";
    private RecyclerView mRecyclerView;
    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    private View containerView;
    private Boolean mUserLearnedDrawer;
    private Boolean mFromSavedInstanceState;
    private DrawerAdapter adapter;

    public NavigationDrawerFragment() {
        mFromSavedInstanceState = false;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
        if (savedInstanceState != null){
            mFromSavedInstanceState = true;
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mRecyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);
        adapter = new DrawerAdapter(getActivity(), getData());
        mRecyclerView.setAdapter(adapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        return layout;
    }

    public static List<DrawerRow> getData(){
        List<DrawerRow> data = new ArrayList<>();
        int icons[] = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};
        String titles[] = {"Link 1","Link 2","Link 3","Link 4"};
        for (int i = 0 ; i < titles.length && i < icons.length; i++){
            DrawerRow current = new DrawerRow();
            current.iconId = icons[i];
            current.title = titles[i];
            data.add(current);
        }

        return data;
    }

    public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
        containerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawerOpen, R.string.drawerClosed){

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                if(!mUserLearnedDrawer){
                    mUserLearnedDrawer = true;
                    saveToPreferences(getActivity(),KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer+"");
                }
                getActivity().invalidateOptionsMenu();
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                getActivity().invalidateOptionsMenu();
            }
        };

        if(!mUserLearnedDrawer && !mFromSavedInstanceState){
            mDrawerLayout.openDrawer(containerView);
        }

        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
    }

    public void saveToPreferences(Context context, String prefName, String prefValue){
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor mEditor = sharedPreferences.edit();
        mEditor.putString(prefName, prefValue);
        mEditor.apply();
    }

    public static String readFromPreferences(Context context, String prefName, String defaultValue){
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        return sharedPreferences.getString(prefName,defaultValue);
    }
}

Adaptateur:

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

    private LayoutInflater inflator;
    List<DrawerRow> data = Collections.EMPTY_LIST;

    public DrawerAdapter(FragmentActivity activity, List<DrawerRow> data) {
        inflator = LayoutInflater.from(activity);
        this.data = data;
    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = inflator.inflate(R.layout.nav_drawer_row , viewGroup,false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder viewHolder, int i) {
        DrawerRow current = data.get(i);
        viewHolder.title.setText(current.title);
        viewHolder.icon.setImageResource(current.iconId);
    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        ImageView icon;
        TextView title;

        public MyViewHolder(View itemView) {
            super(itemView);
            icon = (ImageView) itemView.findViewById(R.id.list_icon);
            title = (TextView) itemView.findViewById(R.id.list_text);
        }
    }
}

Rangée de tiroirs:

public class DrawerRow {
    int iconId;
    String title;
}

Disposition:

<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/drawerLayout">

    <!--Main Content -->
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical">

        <include
            Android:id="@+id/app_bar"
            layout="@layout/app_bar" />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="New Text" />

    </LinearLayout>

    <!--Nav Drawer -->
    <fragment
        Android:layout_width="@dimen/nav_drawer_width"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:name="uk.co.clickcomputing.hhscweatherstation.NavigationDrawerFragment"
        Android:id="@+id/fragment_navigation_drawer"/>

</Android.support.v4.widget.DrawerLayout>

Rangée de tiroirs:

<?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="match_parent">

    <ImageView
        Android:padding="@dimen/list_padding"
        Android:id="@+id/list_icon"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:src="@drawable/ic_launcher"/>

    <TextView
        Android:padding="@dimen/list_padding"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:text="New Text"
        Android:id="@+id/list_text" />
</LinearLayout>

Disposition des fragments du tiroir de navigation:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="#eee"
    Android:orientation="vertical">

        <ImageView
            Android:layout_width="match_parent"
            Android:layout_height="140dp"
            Android:layout_marginBottom="8dp"
            Android:contentDescription="@string/nav_drawer_img_desciption"
            Android:scaleType="centerCrop"
            Android:src="@drawable/nav_drawer" />

        <Android.support.v7.widget.RecyclerView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:id="@+id/drawerList">

        </Android.support.v7.widget.RecyclerView>
    </LinearLayout>
22
cheese12345

Le problème est que vous renvoyez le nombre d'éléments comme 0, ce qui indique qu'il n'y a aucune ligne à afficher. Vous devez renvoyer la taille de la liste comme indiqué ci-dessous.

    @Override
    public int getItemCount() {
        return data.size();
    }
62
Psypher

Remplacer la ligne suivante

 mRecyclerView.setAdapter(adapter);
 mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

avec

mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));    
mRecyclerView.setAdapter(adapter);
12
Mangal

Je suis d'accord que vous devez renvoyer le numéro d'article correct, mais je pense que vous pourriez avoir un problème avec la définition de la hauteur de la vue du recycleur sur wrap_content également. J'ai trouvé ce lien très utile. J'espère que cela aide.

5
Zhivko Dunovski