0

當我第一次啓動應用程序時,我以正確的方式獲得了我的導航抽屜。當我向下滾動抽屜時出現問題。項目消失,其中一些甚至交換位置。我試圖找出什麼是錯的,但我不能。希望你能幫助我。導航在回收視圖時,抽屜項目消失

我已經使用getItemViewType(int)getViewTypeCount()更新了我的代碼,但回收視圖時問題仍然存在。

我離開你一些一段代碼在這裏:

新規範

public class NavDrawerListAdapter extends BaseAdapter { 

    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_HEADER = 1; 
    private static final int TYPE_SWITCH = 2; 
    private static final int TYPE_MAX_COUNT = 3; 

    private Context mContext; 
    private ArrayList<NavDrawerItem> navDrawerItems; 
    LayoutInflater inflater; 

    public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){ 
     this.mContext = context; 
     this.navDrawerItems = navDrawerItems; 
     inflater = (LayoutInflater) 
       context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return navDrawerItems.size(); 
    } 

    @Override 
    public Object getItem(int position) {  
     return navDrawerItems.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     // TODO Auto-generated method stub 
     //return super.getItemViewType(position); 

     if((!navDrawerItems.get(position).getHeaderVisibility()) 
       &&(!navDrawerItems.get(position).getSwitchVisibility())) 
        return TYPE_ITEM; 
     else if((navDrawerItems.get(position).getHeaderVisibility()) 
       &&(!navDrawerItems.get(position).getSwitchVisibility())) 
        return TYPE_HEADER; 
     else if((!navDrawerItems.get(position).getHeaderVisibility()) 
       &&(navDrawerItems.get(position).getSwitchVisibility())) 
      return TYPE_SWITCH; 
     else return TYPE_ITEM; 
    } 

    @Override 
    public int getViewTypeCount() { 
     // TODO Auto-generated method stub 
     //return super.getViewTypeCount(); 
     return TYPE_MAX_COUNT; 
    } 

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

     Log.d("NavDrawerAdapterTest: ", "getView: " + position + " " + convertView); 

     Log.d("NavDrawerAdapter: ", "0"); 
     ViewHolderItem viewHolder; 
     int type = getItemViewType(position); 
     Log.d("NavDrawerAdapter: ", "1"); 

     if (convertView == null) {      

      Log.d("NavDrawerAdapter: ", "2a"); 

      /*LayoutInflater inflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);*/ 
      viewHolder = new ViewHolderItem(); 

      switch (type) { 

       case TYPE_ITEM: 
        convertView = inflater.inflate(R.layout.drawer_list_item, null); 

        viewHolder.textViewTitleItem = (TextView) convertView.findViewById(R.id.title); 
        viewHolder.imageViewIconItem = (ImageView) convertView.findViewById(R.id.icon); 

        viewHolder.imageViewIconItem.setImageResource(navDrawerItems.get(position).getIcon());   
        viewHolder.textViewTitleItem.setText(navDrawerItems.get(position).getTitle()); 
        break; 

       case TYPE_HEADER: 
        convertView = inflater.inflate(R.layout.drawer_list_item_header, null); 

        viewHolder.textViewHeaderItem = (TextView) convertView.findViewById(R.id.drawerHeader); 
        viewHolder.dividerViewItem = (View) convertView.findViewById(R.id.drawerView); 

        viewHolder.textViewHeaderItem.setText(navDrawerItems.get(position).getHeader()); 
        break; 


       case TYPE_SWITCH: 
        convertView = inflater.inflate(R.layout.drawer_list_item_switch, null); 

        break; 
      } 
      convertView.setTag(viewHolder); 

      } else { 
       viewHolder = (ViewHolderItem)convertView.getTag(); 
      } 

     return convertView; 
    } 

    static class ViewHolderItem { 
     TextView textViewTitleItem; 
     ImageView imageViewIconItem; 
     TextView textViewHeaderItem; 
     View dividerViewItem; 
    } 
} 

原代碼

NavDrawerItem.java

public class NavDrawerItem { 

    private String title; 
    private int icon; 
    private String header; 
    private boolean isHeader; 

    public NavDrawerItem(){} 

    public NavDrawerItem(String title, int icon){ 
     this.title = title; 
     this.icon = icon; 
     this.isHeader = false; 
    } 

    public NavDrawerItem(String header) { 
     this(null, 0); 
     this.header = header; 
     this.isHeader = true; 
    } 

    public String getTitle(){ 
     return this.title; 
    } 

    public int getIcon(){ 
     return this.icon; 
    } 

    public String getHeader() { 
     return header; 
    } 

    public boolean getHeaderVisibility() { 
     return isHeader; 
    } 

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

    public void setIcon(int icon){ 
     this.icon = icon; 
    } 

    public void setHeader(String header) { 
     this.header = header; 
    } 

    public void setHeaderVisibility(boolean isHeader) { 
     this.isHeader = isHeader; 
    } 
} 

NavDrawerListAdapter.java

public class NavDrawerListAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<NavDrawerItem> navDrawerItems; 

    public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){ 
     this.context = context; 
     this.navDrawerItems = navDrawerItems; 
    } 

    @Override 
    public int getCount() { 
     return navDrawerItems.size(); 
    } 

    @Override 
    public Object getItem(int position) {  
     return navDrawerItems.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

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

     Log.d("NavDrawerAdapter: ", "0"); 
     ViewHolderItem viewHolder; 
     Log.d("NavDrawerAdapter: ", "1"); 

     if (convertView == null) {      

      Log.d("NavDrawerAdapter: ", "2a"); 

      LayoutInflater inflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      viewHolder = new ViewHolderItem(); 

      convertView = inflater.inflate(R.layout.drawer_list_item_test, null); 

      viewHolder.textViewTitleItem = (TextView) convertView.findViewById(R.id.title); 
      viewHolder.imageViewIconItem = (ImageView) convertView.findViewById(R.id.icon); 
      viewHolder.textViewHeaderItem = (TextView) convertView.findViewById(R.id.drawerHeader); 
      viewHolder.dividerViewItem = (View) convertView.findViewById(R.id.drawerView); 

      convertView.setTag(viewHolder); 

     } else { 

      Log.d("NavDrawerAdapter: ", "2b"); 
      viewHolder = (ViewHolderItem) convertView.getTag(); 

     } 

     if(navDrawerItems.get(position).getHeaderVisibility()) { 


      viewHolder.textViewTitleItem.setVisibility(TextView.INVISIBLE); 
      viewHolder.imageViewIconItem.setVisibility(ImageView.INVISIBLE); 

      viewHolder.textViewHeaderItem.setText(navDrawerItems.get(position).getHeader()); 

      Log.d("NavDrawerAdapter: ", "3a"); 
     } else { 

      viewHolder.textViewHeaderItem.setVisibility(TextView.INVISIBLE); 
      viewHolder.dividerViewItem.setVisibility(View.INVISIBLE); 

      viewHolder.imageViewIconItem.setImageResource(navDrawerItems.get(position).getIcon());   
      viewHolder.textViewTitleItem.setText(navDrawerItems.get(position).getTitle()); 

      Log.d("NavDrawerAdapter: ", "3b"); 
     } 


     return convertView; 
    } 

    static class ViewHolderItem { 
     TextView textViewTitleItem; 
     ImageView imageViewIconItem; 
     TextView textViewHeaderItem; 
     View dividerViewItem; 
    } 
} 

編輯:drawer_list_item_test.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:background="@drawable/list_selector"> 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="25dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="12dp" 
     android:layout_marginRight="12dp" 
     android:contentDescription="@string/desc_list_item_icon" 
     android:src="@drawable/ic_home" 
     android:layout_centerVertical="true" /> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_toRightOf="@id/icon" 
     android:minHeight = "48dp" 
     android:textSize = "16sp" 
     android:textColor="@color/list_item_title" 
     android:gravity="center_vertical" 
     android:paddingRight="40dp"/> 

    <TextView 
     android:id="@+id/drawerHeader" 
     android:layout_above="@id/drawerView" 
     android:layout_marginLeft="12dp" 
     android:layout_marginTop="12dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textStyle="bold" 
     android:textAllCaps="true" 
     android:textColor="@color/list_item_title" /> 


    <View 
     android:id="@+id/drawerView" 
     android:layout_alignParentBottom="true" 
     android:layout_width="match_parent" 
     android:layout_height="2dp" 
     android:layout_marginBottom="1dp" 
     android:layout_marginTop="2dp" 
     android:background="@color/list_background_pressed" /> 

</RelativeLayout> 

回答

1

我有:如果你在一個情況下使用viewHolder.imageViewIconItem.setVisibility(ImageView.INVISIBLE);你必須在第二個案例

這裏一些代碼,可以幫助您使用viewHolder.imageViewIconItem.setVisibility(ImageView.VISIBLE);發現問題爲什麼我無法實現我想要的。我只是爲了一個可能有同樣問題的人離開它。

當我在viewHolder中設置文本和圖像時,我只是在if(convertView == null){...}內部進行設置。相反,我在if(){...}else{...}之後採用了該部分。

所以else{viewHolder = (ViewHolderItem)convertView.getTag();}後我編寫的另一個switch(position)和相同的情況下,我setText()setImageResource()我不同的佈局類型。

希望對某人有用。

1

您有列表視圖和適配器的麻煩。

適配器在getView方法重用「舊」項目視圖。你必須重新設置所有內容

我的意思是:

if(navDrawerItems.get(position).getHeaderVisibility()) { 
     viewHolder.textViewTitleItem.setVisibility(TextView.INVISIBLE);  
     viewHolder.imageViewIconItem.setVisibility(ImageView.INVISIBLE); 

     viewHolder.textViewHeaderItem.setVisibility(TextView.VISIBLE); 
     viewHolder.dividerViewItem.setVisibility(View.VISIBLE); 

     viewHolder.textViewHeaderItem.setText(navDrawerItems.get(position).getHeader()); 
     Log.d("NavDrawerAdapter: ", "3a"); 
    } else { 

     viewHolder.textViewHeaderItem.setVisibility(TextView.INVISIBLE); 
     viewHolder.dividerViewItem.setVisibility(View.INVISIBLE); 

     viewHolder.textViewTitleItem.setVisibility(TextView.VISIBLE);  
     viewHolder.imageViewIconItem.setVisibility(ImageView.VISIBLE); 

     viewHolder.imageViewIconItem.setImageResource(navDrawerItems.get(position).getIcon());   
     viewHolder.textViewTitleItem.setText(navDrawerItems.get(position).getTitle()); 

     Log.d("NavDrawerAdapter: ", "3b"); 
    } 
+0

這很有道理。我會盡可能地添加這些行,並告訴你。 – user1903 2014-09-11 08:42:58

+0

那麼,這解決了我的問題,但頭現在不顯示......不知道爲什麼 – user1903 2014-09-11 14:13:32

+0

你可以給你的XML的'NavDrawerListAdapter'?您可以在視圖可見性方面遇到一些問題。嘗試使用'View.GONE'而不是'View.INVISIBLE' – Stanislav 2014-09-12 06:13:42