1

場景:我有n個選項卡,每個選項卡都有自己的listview。我正在使用陣列適配器來生成一個列表視圖。傳遞給arrayadaper的數組具有對象數組。每個對象都有和。現在基於菜單類型,如果菜單類型是「menugroup」,我需要使用不同的佈局進行繪製,並將背景設置爲RED顏色。使用陣列適配器在ListView中插入分隔符

問題很簡單..每當我向下滾動/向上滾動列表視圖中menugroup行的屬性傳遞給其他行在列表視圖中。換句話說,滾動擾亂了分離器。

以下是適配器的代碼。你能否引導我到需要改正的地步?提前致謝。

public class MyCustomAdapter extends ArrayAdapter<Menu> { 
private ArrayList<Menu> menuItemList; 
Context context; 
LayoutInflater vi; 

    public MyCustomAdapter(Context context ,ArrayList<Menu> menu) {  
     super(context, 0, menu);  
     this.menuItemList = new ArrayList<Menu>();  
     this.menuItemList.addAll(menu); 
     this.context =context; 
     vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    }  

    private class ViewHolder { 
     TextView menuItem; 
     TextView menuGroup; 
    } 
    public View getView(final int position, View convertView, ViewGroup parent) {  
     ViewHolder holder;  
     int type =0; 
     String menuType = menuItemList.get(position).getMenuType(); 
     if (menuType.equals("menugroup")) 
      type=1; 
     if (menuType.equals("menuitem")) 
      type=2; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      switch (type) { 
       case 1: 
       convertView = vi.inflate(R.layout.group, null); 
       holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup); 
       convertView.setBackgroundColor(Color.RED); 
       break;    

       case 2: 
       convertView = vi.inflate(R.layout.item, null); 
       holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
       break; 
      } 
      convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    }  

    switch (type) { 
    case 1:   
    holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
     convertView.setBackgroundColor(Color.RED); 
    break;    
    case 2: 
      holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
    break; 
     } 
     return convertView; 
    } 
} 

回答

3

現在根據菜單類型,如果菜單類型是「MENUGROUP」我需要使用不同的佈局繪製和背景設置爲紅色。

你需要重寫getItemViewType()getViewTypeCount()顯示多於一個類型的佈局,否則你打的適配器的回收......


看起來好像你做了大部分工作,但讓我們改變一些你的代碼:

public int getItemViewType(int position) { 
    if (menuItemList.get(position).getMenuType().equals("menugroup")) 
     return 0; 
    return 1; 
} 

public int getViewTypeCount() { 
    return 2; 
} 

然後使用getView()這樣的:

public View getView(final int position, View convertView, ViewGroup parent) {  
    ViewHolder holder;  
    if (convertView == null) { 
     holder = new ViewHolder(); 
     switch (getItemViewType(position)) { 
     case 0: 
      convertView = vi.inflate(R.layout.group, null); 
      holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup); 
      convertView.setBackgroundColor(Color.RED); 
      break;    
     case 1: 
      convertView = vi.inflate(R.layout.item, null); 
      holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
      break; 
     } 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    }  

    holder.menuItem.setText(menuItemList.get(position).getItemName()); 

    return convertView; 
} 

我怎麼能忽略對menuGroups行的點擊?

以非常類似的方式,您需要重寫兩個更多的方法areAllItemsEnabled()isEnabled(int)。由於啓用的項目只是上面的特定項目類型,因此代碼看起來也是相同的。

public boolean areAllItemsEnabled() { 
    return false; 
} 

public boolean isEnabled(int position) { 
    return menuItemList.get(position).getMenuType().equals("menugroup"); 
} 
+0

感謝山姆,我會做出這種變化,並更新迴應.. – user1822729

+0

哇..謝謝..現在它的工作 – user1822729

+0

山姆,一個更多的問題..我怎麼能忽略menuGroups行點擊..任何線索? – user1822729

0

您可以通過結合這樣的自定義XML文件中添加seprator ..

<LinearLayout 
    android:id="@+id/lnrblog" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 






    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:layout_weight="1.18" > 

     <TextView 
      android:id="@+id/blog_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:layout_weight="1.20" 
      android:gravity="center_vertical" 
      android:text="Title" 
      android:textColor="#ffffff" 
      android:textSize="16sp" 
      android:textStyle="bold" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/blog_date" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:layout_weight="1.20" 
      android:gravity="center_vertical" 
      android:text="Date" 
      android:textColor="#ffffff" 
      android:textSize="16sp" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/lnrdivider" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/blog_desc" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="5dp" 
      android:layout_weight="1.20" 
      android:gravity="center_vertical" 
      android:text="Description" 
      android:textColor="#ffffff" 
      android:textSize="16sp" /> 
    </LinearLayout> 




    <LinearLayout 
     android:id="@+id/linear123" 
     android:layout_width="fill_parent" 
     android:layout_height="2dp" 
     android:background="@drawable/seprater_line" > 

    </LinearLayout> 
</LinearLayout> 

,並在你的java文件寫代碼..

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.customer_list); 

     btnAddCustomer=(Button)findViewById(R.id.btnAddCustomer); 
     lst_customer_list=(ListView)findViewById(R.id.listView1); 

     list=new ArrayList<String>(); 

     list.add("Mehul"); 
     list.add("Sanket"); 
     list.add("Nitin"); 
     list.add("Angel"); 
     list.add("Kirti"); 
     list.add("Kirit"); 
     list.add("Gangeshwar"); 
     list.add("Bhavesh"); 

     lst_customer_list.setAdapter(new Listadapter(getApplicationContext(), R.id.listView1, list)); 


    } 

    public class Listadapter extends ArrayAdapter<String> 
    { 
     ArrayList<String> mList = new ArrayList<String>(); 

     public Listadapter(Context context, int textViewResourceId,ArrayList<String> list) 
     { 
      super(context, textViewResourceId, list); 
      this.mList = list; 

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

      View v = convertView; 

      if(v==null) 
      { 
       LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v=li.inflate(R.layout.custom_row, null); 

      } 

      TextView Title = (TextView) v.findViewById(R.id.custom_text); 
      final RelativeLayout content = (RelativeLayout) v.findViewById(R.id.main); 


      String listitem=mList.get(position); 

      Title.setText(listitem); 


      content.setOnClickListener(new OnClickListener() 
      { 

       @Override 
       public void onClick(View arg0) 
       { 

       } 
      }); 

      return v; 
     } 


    } 
+0

謝謝Mehul ..我用getItemViewType和getViewTypeCount解決了它..再次感謝 – user1822729