Элементы списка Navigation Drawer скрываются/становятся невидимыми при прокрутке

Я работаю с приложением для Android, которое показывает список элементов в навигационном ящике. Ящик содержит как заголовки, так и содержимое под ними. Моя проблема в том, что когда я запускаю приложение в первый раз, все в списке ящиков выглядит хорошо. Но когда я начинаю непрерывно прокручивать вверх и вниз, некоторые элементы списка вверху и внизу экрана скрываются или становятся невидимыми. Я прилагаю необходимые коды того же самого. Пожалуйста, помогите мне в этом.

Класс пользовательского адаптера ящика:

    public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {
Context context;
List<DrawerItem> drawerItemList;
int layoutResID;
Runnable r=null;
Handler handler;
View view;
public CustomDrawerAdapter(Context context, int layoutResourceID,
List<DrawerItem> listItems) {
super(context, layoutResourceID, listItems);
this.context = context;
this.drawerItemList = listItems;
this.layoutResID = layoutResourceID;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final DrawerItemHolder drawerHolder;
view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
drawerHolder = new DrawerItemHolder();
view = inflater.inflate(layoutResID, parent, false);
drawerHolder.ItemName = (TextView) view
.findViewById(R.id.drawer_itemName);
drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);
//drawerHolder.submit=(LinearLayout)view.findViewById(R.id.submit_layout);
// drawerHolder.submit_btn=(Button)view.findViewById(R.id.submit_btn);
/*drawerHolder.submit_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("SUBMIT","SUBMIT CLICKED");
Toast.makeText(getContext(),"SUBMITTED OPTION",Toast.LENGTH_SHORT).show();
}
});*/
drawerHolder.itemlayout=(LinearLayout)view.findViewById(R.id.itemlayout);
drawerHolder.header_icon=(ImageView)view.findViewById(R.id.header_icon);
drawerHolder.title = (TextView) view.findViewById(R.id.header_title);
drawerHolder.headerLayout = (LinearLayout) view
.findViewById(R.id.headerLayout);
view.setTag(drawerHolder);
} else {
drawerHolder = (DrawerItemHolder) view.getTag();
}
final DrawerItem dItem = this.drawerItemList.get(position);
if (dItem.getTitle() != null && drawerHolder.header_icon!=null) {
drawerHolder.headerLayout.setVisibility(LinearLayout.VISIBLE);
drawerHolder.itemlayout.setVisibility(View.GONE);
drawerHolder.title.setText(dItem.getTitle());
//drawerHolder.submit.setVisibility(View.GONE);
} else {
drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(dItem.getImgResID()));
drawerHolder.header_icon.setVisibility(View.GONE);
drawerHolder.headerLayout.setVisibility(LinearLayout.GONE);
drawerHolder.ItemName.setText(dItem.getItemName());
//drawerHolder.submit.setVisibility(View.GONE);
}
/* else if(dItem.getTitle().contains("button"))
{
drawerHolder.headerLayout.setVisibility(LinearLayout.GONE);
drawerHolder.itemlayout.setVisibility(View.GONE);
//drawerHolder.submit.setVisibility(View.VISIBLE);
}*/
return view;
}
private static class DrawerItemHolder {
TextView ItemName, title;
ImageView icon,header_icon;
LinearLayout headerLayout,itemlayout;
LinearLayout submit;
//Button submit_btn;
}
}

Класс элемента ящика:

public class DrawerItem {
String ItemName;
int imgResID;
public int getHeader_image() {
return header_image;
}
public void setHeader_image(int header_image) {
this.header_image = header_image;
}
int header_image;
String title;
boolean isSpinner;
public DrawerItem(String itemName, int imgResID) {
super();
ItemName = itemName;
this.imgResID = imgResID;
}
public DrawerItem(String title) {
this(null, 0);
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isSpinner() {
return isSpinner;
}
public String getItemName() {
return ItemName;
}
public void setItemName(String itemName) {
ItemName = itemName;
}
public int getImgResID() {
return imgResID;
}
public void setImgResID(int imgResID) {
this.imgResID = imgResID;
}
}

И я вызываю и рисую элементы списка ящиков навигации, как указано в приведенном ниже фрагменте из моего класса домашней страницы:

//--------------------NAVIGATION DRAWER ITEMS-----------------------------//
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mDrawerLayout.setDrawerShadow(android.R.color.background_light,
GravityCompat.START);
dataList = new ArrayList<DrawerItem>();
String[] options = getResources().getStringArray(R.array.options);
dataList.add(new DrawerItem("Select your stylist", R.drawable.ic_stylist_select));
dataList.add(new DrawerItem("All Stylist"));
/*---------------STYLIST ARRAY NAVIGATION DRAWER-------------------------*/
stylistnamearray = new ArrayList<>();
for (int i = 0; i < jObj.length(); i++) {
JSONObject object = null;
try {
object = jObj.getJSONObject(i);
String stylistname = object.getString("StylistName");
stylistnamearray.add(stylistname);
set = new HashSet<>();
set.addAll(stylistnamearray);
} catch (JSONException e) {
e.printStackTrace();
}
}
stylistarray = set.toArray(new String[set.size()]);
for (int i = 0; i < set.size(); i++) {
dataList.add(new DrawerItem(stylistarray[i]));
Log.e("STYLIST ARRAY LIST", stylistarray[i]);
}
dataList.add(new DrawerItem("Select your location", R.drawable.ic_globe));
/*-------------------------LOCATION ARRAY NAVIGATION DRAWER--------------------------*/
location_arraylist = new ArrayList<>();
for (int i = 0; i < jObj.length(); i++) {
JSONObject object = null;
try {
object = jObj.getJSONObject(i);
String stylistname = object.getString("Location");
location_arraylist.add(stylistname);
set = new HashSet<>();
set.addAll(location_arraylist);
} catch (JSONException e) {
e.printStackTrace();
}
}
locationarray = set.toArray(new String[set.size()]);
for (int i = 0; i < set.size(); i++) {
dataList.add(new DrawerItem(locationarray[i]));
Log.e("LOCATION ARRAY LIST", locationarray[i]);
}
dataList.add(new DrawerItem("Select my designer", R.drawable.ic_stylist));
dataList.add(new DrawerItem("Wanna be a stylist ?", R.drawable.ic_stylist));
dataList.add(new DrawerItem("Hi Marya !", R.drawable.ic_call));
mDrawerList.bringToFront();
mDrawerLayout.requestLayout();
mDrawerList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == SCROLL_STATE_IDLE) {
mDrawerList.bringToFront();
mDrawerLayout.requestLayout();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});

И, наконец, мои макеты xml (для справки):

XML-макет домашней страницы:

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view. -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/black"
android:dividerHeight="1dp"
android:background="#ddd8ba">
</ListView>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
</android.support.v4.widget.DrawerLayout>

пользовательский макет элемента ящика xml:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="0"
android:background="#ddd8ba">
<LinearLayout
android:id="@+id/headerLayout"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:gravity="left"
android:background="@drawable/list_item_selector"
android:orientation="horizontal">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/header_icon"
android:padding="2dp"/>
<TextView
android:id="@+id/header_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:padding="10dp"
android:textColor="#000"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="15dp"
android:textStyle="bold" />
</LinearLayout>
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tablerow"
android:background="#244242"
android:orientation="vertical">
<LinearLayout
android:id="@+id/itemlayout"
android:layout_width="fill_parent"
android:layout_span="1"
android:background="@drawable/reverse_list_item_selector"
android:layout_height="40dp"
android:layout_below="@+id/headerLayout">
<ImageView
android:id="@+id/drawer_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@android:color/transparent"
android:padding="5dp" />
<TextView
android:id="@+id/drawer_itemName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="10dp"
android:text="KRISH"
android:textColor="@color/ivorycream_background"
android:textSize="14dp" />
</LinearLayout>
</TableRow>
</TableLayout>

Спасибо всем заранее. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.


person Krish3090    schedule 29.12.2014    source источник


Ответы (1)


Проверьте свой CustomDrawerAdapter класс и ListView еще раз. Ниже методы работали для меня.

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (view == null) {
        LayoutInflater mInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        view = mInflater.inflate(R.layout.your_custom_drawer_item, null);
    }

    // use View, not LinearLayout
    View navigationDrawerItemLayout = view.findViewById(R.id.itemLayout);
    View navigationDrawerHeaderLayout = view.findViewById(R.id.headerLayout);

    // for item layout. It based on your "if (itemCondition != null)"
    if ((dItem.getTitle() != null) && (drawerHolder.your_item != null)) {
            // It means, all of navigationDrawerItemLayout's contains are set to VISIBLE
            navigationDrawerItemLayout.setVisibility(View.VISIBLE);
            // It means, all of navigationDrawerHeaderLayout's contains are set to GONE
            navigationDrawerHeaderLayout.setVisibility(View.GONE);
        }

    // For header layout. It based on your "if (headerCondition != null)"
    if ((dItem.getTitle() != null) && (drawerHolder.your_header != null)) {
            // It means, all of navigationDrawerItemLayout's contains are set to GONE
            navigationDrawerItemLayout.setVisibility(View.GONE);
            // It means, all of navigationDrawerHeaderLayout's contains are set to VISIBLE
            navigationDrawerHeaderLayout.setVisibility(View.VISIBLE);
        }

    return view;

В вашем ListView:

<ListView
    android:id="@+id/left_drawer"
    android:background="@color/your_list_background"
    android:cacheColorHint="#00000000"
    android:scrollbarFadeDuration="0" />
person Anggrayudi H    schedule 29.12.2014
comment
Спасибо, братан .. Я посмотрю на это и сообщу, работает ли он. Если он работает, я приму ваш ответ! Ценю ваши усилия по просмотру множества кодов в моем вопросе :) - person Krish3090; 29.12.2014
comment
Ты спас мой день, братан! Это сработало! :D Огромное спасибо! :) - person Krish3090; 29.12.2014