2

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

У меня есть два списка, которые у меня есть в LinearLayout (по вертикали). Я хочу, чтобы Listviews обертывали свой контент, когда дело доходило до высоты, поэтому им никогда не нужно прокручивать внутренне. Вместо этого я хотел бы прокрутить страницу вниз, чтобы увидеть что-то, что переполняется.

Заранее благодарим за помощь! Если вы предлагаете полностью переделать архитектуру, то я также открыт для этого. Единственное, о чем я прошу, так это то, чтобы решение было максимально простым и простым. Hackish обходные пути не предпочтительны. :)

+0

Пожалуйста, напишите, что вы пробовали. Возможно, вам придется использовать атрибут «weight». – Aniruddha

ответ

1

Насколько я знаю, вы пытаетесь сделать ListView как высота его содержание требует.

Вы можете создать пользовательский элемент управления ListView, который проходит ListView и переопределить его метод onMeasure так:

public class UnscrollableListView extends ListView { 

    public UnscrollableListView(Context context) { 
     super(context); 
    } 

    public UnscrollableListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public UnscrollableListView(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int maxHeightSpec = MeasureSpec.makeMeasureSpec( 
       Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 
     super.onMeasure(widthMeasureSpec, maxHeightSpec); 
    } 

} 

Это сделает ваш ListView, чтобы обернуть их содержание.

Как вам нужно прокрутить вниз, попробуйте добавить ScrollView в свой макет, чтобы обернуть LinearLayout. Наконец, ваш макет что-то вроде:

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

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

     <com.example.UnscrollableListView 
      android:id="@+id/listview1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <com.example.UnscrollableListView 
      android:id="@+id/listview2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</ScrollView> 

Является ли это то, что вы хотите?

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

Вы можете посмотреть на эту статью: Performance Tips for Android’s ListView

+0

Это идеальное решение ... все должны избегать этого! Спасибо!!! – stellarowl12

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

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" > 
    </ListView> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" > 
    </ListView> 

</LinearLayout> 
0

сделать так,

listview_main.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" > 

     <ScrollView 
      android:id="@+id/scrollview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 

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

<View 
       android:layout_width="match_parent" 
       android:layout_height="5dp" 
       android:background="@android:color/black" /> 

       <LinearLayout 
        android:id="@+id/list_view2" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical" > 
       </LinearLayout> 
      </LinearLayout> 
     </ScrollView> 

</LinearLayout> 

Adapter1.java (Adapter2 такой же, как Adapter1)

public class Adapter1 extends BaseAdapter { 

    private Activity activity; 
    private LayoutInflater mInflater; 
    private ArrayList<String> arraylist1 = new ArrayList<String>(); 

    public Adapter1(Activity act, ArrayList<String> array) { 

     this.activity = act; 
     this.arraylist1 = array; 
     mInflater = LayoutInflater.from(activity); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return arraylist1.size(); 
    } 

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

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return arraylist1.get(position).hashCode(); 
    } 

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

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item1, null); 

      holder = new ViewHolder(); 

      holder.lablel = (TextView) convertView.findViewById(R.id.label); 

      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.lablel.setText(arraylist1.get(position).toString()); 

     return convertView; 

    } 

    private class ViewHolder { 
     TextView lablel = null; 
    } 

} 

MainActivity.java

public class MainActivity extends Activity { 
    private ArrayList<String> arraylist1 = new ArrayList<String>(); 
    private ArrayList<String> arraylist2 = new ArrayList<String>(); 

    private Adapter1 adapter1 = null; 
    private Adapter2 adapter2 = null; 

    private LinearLayout listview2; 
    private LinearLayout listview1; 
    private ScrollView scrollView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listview_main); 

     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 
     arraylist1.add("listview_item1"); 

     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 
     arraylist2.add("listview_item2"); 

     listview1 = (LinearLayout) findViewById(R.id.list_view1); 
     listview2 = (LinearLayout) findViewById(R.id.list_view2); 
     scrollView = (ScrollView) findViewById(R.id.scrollview); 

     adapter1 = new Adapter1(MainActivity.this, arraylist1); 
     adapter2 = new Adapter2(MainActivity.this, arraylist2); 

     listview1.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 

       scrollView.requestDisallowInterceptTouchEvent(true); 
       return false; 
      } 
     }); 

     listview1.removeAllViews(); 
     if (adapter1 != null && adapter1.getCount() > 0) { 
      for (int i = 0; i < adapter1.getCount(); i++) { 

       final View convertView = adapter1.getView(i, null, null); 
       if (listview1 != null) 
        listview1.addView(convertView); 
      } 
     } 

     listview2.removeAllViews(); 
     if (adapter2 != null && adapter2.getCount() > 0) { 
      for (int i = 0; i < adapter2.getCount(); i++) { 

       final View convertView = adapter2.getView(i, null, null); 
       if (listview2 != null) 
        listview2.addView(convertView); 
      } 
     } 

    } 

} 

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

  • Нет связанных вопросов^_^