2016-10-14 2 views
0

Я знаю, что это не лучшая практика поместить два ListViews в ScrollView. Тем не менее, это лучшее решение, которое я могу придумать для своей проблемы:Два ListViews в ScrollView

Я хочу, чтобы два списка (первый из 1-5 элементов и последний с максимум 20 элементами) под друг другом в прокручиваемом вид, каждый с собственным заголовком. ListViews не должны сами прокручиваться, они должны просто менять высоту, чтобы обернуть их содержимое. Прокручиваемая часть будет обрабатываться ScrollView.

Поскольку ListView не поддерживает это изначально я использую следующий код:

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     // pre-condition 
     return; 
    } 

    int totalHeight = 0; 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); 

    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += listItem.getMeasuredHeight(); 
     Log.d("DEBUG", "TotalHeight:" + totalHeight); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listAdapter.getCount() * listView.getDividerHeight()); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

Однако, это делает ListViews примерно в 10 раз больше, то они должны быть. Если я ищу проблему, которую у меня есть, я всегда нахожу решение выше, но для меня это, похоже, не работает.

Есть ли способ исправить мой код или есть лучший способ пойти на это?

XML:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.miscoriadev.svvirgoapp.fragments.frag_activiteiten" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingTop="@dimen/activity_vertical_margin"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/tv_acti_komende_activiteiten" 
      android:textSize="32sp" 
      android:text="Komende activiteiten" 
      android:textColor="@color/TextColorDark" 
      android:gravity="center"/> 

     <ListView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/tv_acti_komende_activiteiten" 
      android:id="@+id/lv_komende_activiteiten"> 
     </ListView> 

     <TextView 
      android:paddingTop="@dimen/activity_vertical_margin" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textSize="32sp" 
      android:text="Afgelopen activiteiten" 
      android:textColor="@color/TextColorDark" 
      android:gravity="center" 
      android:layout_marginLeft="@dimen/activity_horizontal_margin" 
      android:id="@+id/tv_acti_afgelopen_activiteiten" 
      android:layout_below="@id/lv_komende_activiteiten"/> 

     <ListView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/tv_acti_afgelopen_activiteiten" 
      android:id="@+id/lv_afgelopen_activiteiten"> 
     </ListView> 

    </RelativeLayout> 

+0

Вам нужны оба списка для прокрутки в одно и то же время и их отображение на одном экране? Если это так, я бы рекомендовал использовать [GridView] (https://developer.android.com/guide/topics/ui/layout/gridview.html) с двумя столбцами. Если нет, я бы рекомендовал использовать [ViewPager] (https://developer.android.com/training/animation/screen-slide.html) с помощью [TabLayout] (https://developer.android.com/reference/android /support/design/widget/TabLayout.html). Вот учебник о том, как это сделать: https://guides.codepath.com/android/google-play-style-tabs-using-tablayout – klauskpm

+0

Нет, я просто хочу, чтобы они были под друг другом и имели два списка в один прокручиваемый кадр –

+0

Я считаю, что было бы удобнее использовать горизонтальные 'ListView' вместо вертикальных. Я даже рекомендую использовать [RecyclerView] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html), который может быть горизонтальным или вертикальным. – MohanadMohie

ответ

0

Я решить мою проблему, создав свой собственный элемент списка UI из LinearLayout раздувая мнения в него, как ListAdapter бы сделать для ListView.

Однако немного грубо, вы можете легко переписать этот код, чтобы принять объект ListAdapter в качестве источника элемента. Переписывая метод setListItems(), чтобы получить его представления методом getView() объекта ListAdapter.

package com.miscoriadev.svvirgoapp.util; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import com.miscoriadev.svvirgoapp.MainActivity; 
import com.miscoriadev.svvirgoapp.R; 

import java.util.ArrayList; 

/** 
* Created by milanvandijck on 14/10/2016. 
*/ 

public class UnscrollableListView extends LinearLayout{ 

private Context context; 
private LayoutInflater inflater; 
private MainActivity mainActivity; 

public UnscrollableListView(Context context) { 
    super(context); 
    this.context = context; 
    this.mainActivity = (MainActivity)context; 
    this.setOrientation(LinearLayout.VERTICAL); 

    if(!this.isInEditMode()) { 
     inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
    } 
} 

public UnscrollableListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.context = context; 
    this.mainActivity = (MainActivity)context; 
    this.setOrientation(LinearLayout.VERTICAL); 

    if(!this.isInEditMode()) { 
     inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
    } 
} 


public void setListItems(ArrayList<ActivityItem> list){ 

    for (int i = 0; i <= list.size()-1; i++){ 
     UnscrollableListView.viewHolder holder = new UnscrollableListView.viewHolder(); 
     View rowView; 
     final ActivityItem item = list.get(i); 

     Log.d(getClass().getName(), "Adding view: " + item.getTitle()); 

     // Check if there are activities 
     if (item.getTitle().equals("0_0") && item.getLocation().equals("0_0")){ 
      rowView = inflater.inflate(R.layout.activiteiten_listitem_emptylist, null); 
      this.addView(rowView); 
     } 

     rowView = inflater.inflate(R.layout.activiteiten_listitem, null, false); 

     holder.tv_name=(TextView) rowView.findViewById(R.id.eventName); 
     holder.tv_date=(TextView) rowView.findViewById(R.id.eventDate); 
     holder.tv_time=(TextView) rowView.findViewById(R.id.eventTime); 
     holder.tv_Location= (TextView) rowView.findViewById(R.id.eventLocation); 
     holder.img_poster=(ImageView) rowView.findViewById(R.id.eventPoster); 

     holder.tv_name.setText(item.getTitle()); 
     holder.img_poster.setImageBitmap(item.getImage()); 
     holder.tv_date.setText(item.getDateString()); 
     holder.tv_time.setText(item.getTimeString()); 
     holder.tv_Location.setText(item.getLocation()); 

     rowView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       mainActivity.openActivityDetails(item); 
      } 
     }); 

     this.addView(rowView, i); 
    } 

    this.invalidate(); 

} 

public class viewHolder 
{ 
    TextView tv_name; 
    TextView tv_date; 
    TextView tv_time; 
    TextView tv_Location; 
    ImageView img_poster; 
} 
} 
Смежные вопросы