Navigation Drawer ListView mit Image wie kann ich das machen?

  • Antworten:4
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 70

10.03.2016, 21:12:16 via Website

Hallo leute ich habe einen NavDrawer mit einem passenden xml layout und adapter und alles.
Der Code ist von einem Tutorial mit einem Nav drawer leider nur mit einer listview ohne images.
Jetzt habe ich das image neben der Listview hinzugefügt ohne Fehler.
Nur ist der Adapter Code so kompliziert dass ich im adaptercode nich weis wo die stelle ist wo ich sage welche images zu welchen Wort in der ListView gehören.
Ich hab das Gefühl dass die Stelle in der FragmentDrawer.java liegt da dort auch die ListView eingelesen wird.
Nur weis ich nicht wo dort die images einfügen.
Hab hier mal jeden relevanten Code für den NavigationDrawer eingefügt.
Könnt ihr mir hier bitte helfen.

NavigationDrawerAdapter.java

public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {
    List<NavDrawerItem> data = Collections.emptyList();
    private LayoutInflater inflater;
    public NavigationDrawerAdapter(Context context, List<NavDrawerItem> data) {
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    public void delete(int position) {
        data.remove(position);
        notifyItemRemoved(position);
    }

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

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NavDrawerItem current = data.get(position);
        holder.title.setText(current.getTitle());
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView title;

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

FragmentDrawer.java

public class FragmentDrawer extends Fragment {

    private static String TAG = FragmentDrawer.class.getSimpleName();

    private RecyclerView recyclerView;
    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    private NavigationDrawerAdapter adapter;
    private View containerView;
    private static String[] titles = null;
    private FragmentDrawerListener drawerListener;

    public FragmentDrawer() {

    }

    public void setDrawerListener(FragmentDrawerListener listener) {
        this.drawerListener = listener;
    }

    public static List<NavDrawerItem> getData() {
        List<NavDrawerItem> data = new ArrayList<>();


        // preparing navigation drawer items
        for (int i = 0; i < titles.length; i++) {
            NavDrawerItem navItem = new NavDrawerItem();
            navItem.setTitle(titles[i]);
            data.add(navItem);
        }
        return data;
    }

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

        // drawer labels
        titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflating view layout
        View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);

        adapter = new NavigationDrawerAdapter(getActivity(), getData());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                drawerListener.onDrawerItemSelected(view, position);
                mDrawerLayout.closeDrawer(containerView);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));

        return layout;
    }


    public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) {
        containerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getActivity().invalidateOptionsMenu();
            }

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


        };

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

    }

    public static interface ClickListener {
        public void onClick(View view, int position);

        public void onLongClick(View view, int position);
    }

    static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

        private GestureDetector gestureDetector;
        private ClickListener clickListener;

        public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.clickListener = clickListener;
            gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                    if (child != null && clickListener != null) {
                        clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                    }
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                clickListener.onClick(child, rv.getChildPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }


    }

    public interface FragmentDrawerListener {
        public void onDrawerItemSelected(View view, int position);
    }
}

NavDrawerItem.java

public class NavDrawerItem {
    private boolean showNotify;
    private String title;


    public NavDrawerItem() {

    }

    public NavDrawerItem(boolean showNotify, String title) {
        this.showNotify = showNotify;
        this.title = title;
    }

    public boolean isShowNotify() {
        return showNotify;
    }

    public void setShowNotify(boolean showNotify) {
        this.showNotify = showNotify;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

nav_drawer_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="//schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true">

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/imageView1"
        android:paddingBottom="10dp"

        android:paddingTop="10dp"
        android:textSize="15dp"
        android:textStyle="bold" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/title"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
       />

strings.xml

 <string name="nav_item_home">Home</string>
    <string name="nav_item_playlists">Playlists</string>
    <string name="nav_item_ads">Remove Ads</string>


    <!-- navigation drawer item labels  -->
    <string-array name="nav_drawer_labels">
    <item>@string/nav_item_home</item>
    <item>@string/nav_item_playlists</item>
    <item>@string/nav_item_ads</item>

    </string-array>

Antworten
Gelöschter Account
  • Forum-Beiträge: 70

13.03.2016, 12:13:31 via App

Kann wer helfen bitte

Antworten
  • Forum-Beiträge: 22.353

13.03.2016, 12:19:25 via Website

Hallo Lukas,

bitte nicht pushen - ich bin mir sicher, dass sich hier jemand melden wird, sobald er eine Antwort für dich hat. Danke (smug)

Viele Grüße,
Andy


OnePlus 3 (Resurrection Remix 5.8.2)
LG G Watch

Regeln | unsere Mods & Admins

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

13.03.2016, 12:24:50 via Website

Hallo Lukas,
bitte nicht pushen! / Andy war schneller ;)
Danke


Bilder müsstest du da zuweise, wo du auch den Text des TextViews zuweistz also hoer:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
NavDrawerItem current = data.get(position);
holder.title.setText(current.getTitle());
}

Es ist dort aber recht ungeschickt. ich würde mir im Adapter eine setImages Methode, damit geht es am einfachsten

Tipp: Ich würde für NavigationDrawer, direkt die Kompnenten Nutzen die Google über die DesignLib im Material Design anbietet. Damit musst du die ganzen List Kompnenten nicht selbe machen

— geändert am 13.03.2016, 12:25:11

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 70

13.03.2016, 20:53:58 via Website

ich habs bis jetzt so gemacht komme aber nicht sorecht weiter:

Hier habe ich holder.image.setImageResource(current.getIdImg(position));hinzugefügt:

   @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    NavDrawerItem current = data.get(position);
    holder.title.setText(current.getTitle());
    holder.image.setImageResource(current.getIdImg(position));
}

Hier habe ich image = (ImageView) itemView.findViewById(R.id.imageView1);hinzugefügt:

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

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title);
            image = (ImageView) itemView.findViewById(R.id.imageView1);
        }
    }

Und hier habe ich in der NavDrawerItem.java eine Methoden für die images (getIdImg) hinzugefügt und oben die Images definiert:

public class NavDrawerItem {
    private boolean showNotify;
    private String title;
    public int images[] = {
            R.drawable.ic_home_black_48dp,
            R.drawable.ic_home_black_48dp,
            R.drawable.ic_home_black_48dp,
            R.drawable.ic_launcher
    };


    public NavDrawerItem() {

    }

    public NavDrawerItem(boolean showNotify, String title, int images[]) {
        this.showNotify = showNotify;
        this.title = title;
        this.images = images;
    }

    public boolean isShowNotify() {
        return showNotify;
    }

    public void setShowNotify(boolean showNotify) {
        this.showNotify = showNotify;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getIdImg(int images) {
        return images;
    }

jetzt steht aber das in der logcat:

image

Antworten

Empfohlene Artikel