2013-03-28 4 views
2

У меня есть ListView, который может принимать 2 разных типа объектов: Food and SectionItem.Пользовательский ListView с другим размером элемента Android

У меня есть это:

enter image description here

Я хотел бы знать, если это возможно, чтобы сделать разницу Layout набивка/маржу между SectionItem и элементом питания, как это (продолжайте использовать только один ListView):

enter image description here

Вот мой адаптер:

public class FoodsAdapter extends ArrayAdapter<Item> { 

    private Context context; 
    private ArrayList<Item> items; 
    private LayoutInflater vi; 

    public FoodsAdapter(Context context,ArrayList<Item> items) { 
     super(context,0, items); 
     this.context = context; 
     this.items = items; 
     vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

     final Item i = items.get(position); 
     if (i != null) { 
      if(i.isSection()){ 
       SectionItem si = (SectionItem)i; 
       v = vi.inflate(R.layout.activity_souscarte_list_item_titlesouscategorie, null); 

       v.setOnClickListener(null); 
       v.setOnLongClickListener(null); 
       v.setLongClickable(false); 

       final TextView sectionView = (TextView) v.findViewById(R.id.souscarte_titlesouscategorie); 
       sectionView.setText(si.getTitle()); 
      }else{ 
       Food food = (Food)i; 
       v = vi.inflate(R.layout.activity_souscarte_list_item_elementsouscategorie, null); 

       final TextView title = (TextView) v.findViewById(R.id.souscarte_element_title); 
       final TextView prix = (TextView) v.findViewById(R.id.souscarte_element_prix); 
       final TextView desc = (TextView) v.findViewById(R.id.souscarte_element_desc); 

       if (title != null) 
         title.setText(food.getName()); 
       if (prix != null) 
         prix.setText(Float.toString(food.getPrice())+ "€"); 
       if (desc != null) 
         desc.setText(food.getDescription()); 
      } 
     } 
     return v; 
    } 

} 

вот моя активность:

public class SousCarteActivityNew extends Activity { 
    private ArrayList<ArrayList<Food>> arraySousCategories; 
    private ArrayList<Item> allFoodsInOne; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_souscarte_list_item); 

     arraySousCategories = FoodsContainer.sousCategoriesArray; 

     allFoodsInOne = new ArrayList<Item>(); 
     for (ArrayList<Food> foodArray : arraySousCategories){ 
      allFoodsInOne.add(new SectionItem(foodArray.get(0).getType())); 
      for (Food food : foodArray){ 
       allFoodsInOne.add(food); 
      } 
     } 
     LinearLayout ll = (LinearLayout) findViewById(R.id.souscarte_linearlayout); 
     ListView lv = new ListView(getApplicationContext()); 
     FoodsAdapter adapter = new FoodsAdapter(getApplicationContext(), allFoodsInOne); 
     lv.setAdapter(adapter); 
     ll.setPadding(15, 15, 15, 0); 
     ll.addView(lv); 
    } 
} 

Вот мой activity_souscarte_list_item_titlesouscategorie.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView android:id="@+id/souscarte_titlesouscategorie" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/green" 
     android:gravity="center" 
     android:layout_margin="0dp" 
     android:textColor="@color/white" 
     android:textSize="19sp"/> 

</LinearLayout> 

Вот мой activity_souscarte_list_item_elementsouscategorie.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="@color/white" 
    android:id="@+id/souscarte_element_layout" 
    android:layout_marginLeft="17dp" 
    android:layout_marginRight="17dp" 
    android:padding="5dp"> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textStyle="bold" 
      android:id="@+id/souscarte_element_title" 
      android:textColor="@color/black" 
      android:layout_weight="3" 
      android:paddingLeft="5dp"/> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textStyle="bold" 
      android:id="@+id/souscarte_element_prix" 
      android:gravity="right" 
      android:textColor="@color/black" 
      android:layout_weight="1" 
      android:paddingRight="5dp"/> 
    </LinearLayout> 
    <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="@color/black" 
     android:id="@+id/souscarte_element_desc" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp"/> 
</LinearLayout> 

ответ

1

Да, есть решение. дайте разные top_margin в ваш раздел от getView. Для этого вам нужно использовать LinearLayoutParam.

Существует метод под названием setMargin(left,top,right,bottom), просто укажите подходящее значение для top и назначьте layoutParam вашей строке.

0

Я просто поместил все свои макеты в FrameLayout с дополнением, чтобы сделать трюк.

Смежные вопросы