Как прокрутить макет, который имеет 3 вида списка

У меня есть один макет. Этот макет содержит 3 вида списка с высотой данных wrap_content в Listview, но не исправляет. Когда Listview имеет литеральные огромные данные, в это время данные идут снизу и данные не могут видеть, поэтому я хочу прокрутить представление со всеми тремя списками, как это возможно.

У кого-нибудь есть идея об этом?

Это мое представление, которое содержит 3 Listview, теперь это с меньшим количеством данных, но когда данные будут огромными в то время, у последнего Listview возникнут проблемы для просмотра. Я хочу прокрутить серый цвет...

enter image description here

Ответ 1

Используйте линейный макет вместо списка в вашем XML файле. Это ваш XML файл.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:id="@+id/scr" android:layout_height="fill_parent"
    android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout android:layout_width="fill_parent"
        android:id="@+id/r2" android:orientation="vertical"
        android:layout_height="fill_parent" android:paddingTop="100dip"
        android:paddingBottom="100dip">
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l1" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#00B2EE">
        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l2" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#00EE76">

        </LinearLayout>
        <LinearLayout android:layout_width="fill_parent"
            android:id="@+id/l3" android:orientation="vertical"
            android:layout_height="wrap_content" android:layout_marginTop="10dip"
            android:background="#7171C6">
        </LinearLayout>
    </LinearLayout>
</ScrollView>

и поместите другой xml, который будет завышен списком.

это ваш основной класс активности.

package com.list.add;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class NewlistActivity extends Activity {
    /** Called when the activity is first created. */
    LinearLayout l1,l2,l3;
    ScrollView scrollView;
    ViewGroup contentView;
    List<String> list = new ArrayList<String>();
    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();

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

        l1 = (LinearLayout) findViewById(R.id.l1);
        l2 = (LinearLayout) findViewById(R.id.l2);
        l3 = (LinearLayout) findViewById(R.id.l3);
        scrollView = (ScrollView) findViewById(R.id.scr);
        contentView = (ViewGroup) findViewById(R.id.r2);
        scrollView.setOnTouchListener(new ScrollPager(scrollView, contentView));
        scrollView.post(new Runnable() {
            public void run() {
                scrollView.scrollTo(0, contentView.getPaddingTop());
            }
        });
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Shah");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Parth");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Chirag");
        list.add("Shah");

        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");
        list1.add("Parth");

        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        list2.add("Kalpesh");
        System.out.println(list);
        System.out.println(list1);
        System.out.println(list2);
        for (int i=0; i<list.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list.get(i));
        l1.addView(vi);
        }
        for (int i=0; i<list1.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list1.get(i));
        l2.addView(vi);
        }
        for (int i=0; i<list2.size(); i++) 
        {
        LayoutInflater inflater = getLayoutInflater();
        View vi = inflater.inflate(R.layout.raw, null);
        TextView tv = (TextView) vi.findViewById(R.id.textView1);
        tv.setText(list2.get(i));
        l3.addView(vi);
        }
    }

}

и сделайте один класс прокрутки следующим образом:

public class ScrollPager implements OnTouchListener
public ScrollPager(ScrollView aScrollView, ViewGroup aContentView)
    {
        mScrollView = aScrollView;
        mContentView = aContentView;
        scroller = new Scroller(mScrollView.getContext(), new OvershootInterpolator());
        task = new Runnable()
        {
            public void run()
            {
                scroller.computeScrollOffset();
                mScrollView.scrollTo(0, scroller.getCurrY());

                if (!scroller.isFinished())
                {
                    mScrollView.post(this);
                }
            }
        };
    }
public boolean onTouch(View v, MotionEvent event)
    {
        // Stop scrolling calculation.
        scroller.forceFinished(true);
        // Stop scrolling animation.
        mScrollView.removeCallbacks(task);

        if (event.getAction() == MotionEvent.ACTION_UP)
        {

Ответ 2

В каждом элементе ListView в XML-макете следует использовать атрибут weight android:layout_weight="1". Чтобы он разделил экран с равным пространством для каждого списка, и ваша прокрутка будет работать для каждого ListView.

Ответ 3

Если вы представляете материал в вертикальном или горизонтальном стеке, вы должны использовать LinearLayout, а затем использовать атрибут layout_weight для управления пропорциями отдельных строк/столбцов в контейнере.

Если вы хотите размер экрана, установите layout_width и layout_height в fill_parent, иначе вы не получите все доступные размеры экрана. Если вы попытаетесь использовать wrap_content для высоты, все рухнет, если вы не прибегнете к дополнительным ограничениям макета, например. minHeight.

Мы используем это везде, и он достаточно надежный. Для трех элементов вы можете использовать 1/1/1 или 3/3/3.

Веса также не должны быть равны! Вы можете разделить пропорции любым способом; веса - это только относительные отношения всего диапазона (ширина/высота). Например. если вы хотите, чтобы средний элемент в два раза превышал размер, используйте 1/2/1; если вы хотите, чтобы 40% использовали 30/40/30 или 3/4/3.

Хорошим "трюком" является использование layout_weight= 1 на ровно одну строку/столбец (другие по умолчанию равны нулю), и он будет "заполнять" любое оставшееся пространство. Это общий сценарий компоновки.

Если вам нужен прокручиваемый стек, вы можете поместить его в ScrollView. В этом случае вы должны установить layout_height от LinearLayout до wrap_content, и вы будете подвергнуты свертыванию в зависимости от прихоти системы макета (это означает, что вам нужно использовать ограничения min/max).

Ответ 4

Вместо этого позвольте мне дать наилучшую идею для того же типа реализации.

Вы когда-нибудь думали использовать ExpandableListView для такой же реализации? Просто покажите элемент первой группы как расширенный и сделайте другие 2 группы свернутыми, просто разверните их, когда пользователь нажимает на определенную группу.

Вот несколько примеров для этого:

Я уверен, что эта идея не очень хорошая, но если вы ее реализуете, вы обязательно найдете ее в своем случае.

Ответ 5

Используйте этот метод, и ваш список будет прокручиваться внутри scrollview: -

ListView lstNewsOffer.setAdapter(new ViewOfferAdapter(
                        ViewNewsDetail.this, viewOfferList));
                getListViewSize(lstNewsOffer);

 void getListViewSize(ListView myListView) {
ListAdapter myListAdapter = myListView.getAdapter();
if (myListAdapter == null) {
    // do nothing return null
    return;
}
// set listAdapter in loop for getting final size
int totalHeight = 0;
for (int size = 0; size < myListAdapter.getCount(); size++) {
    View listItem = myListAdapter.getView(size, null, myListView);
    listItem.measure(0, 0);
    totalHeight += listItem.getMeasuredHeight();
}
// setting listview item in adapter
ViewGroup.LayoutParams params = myListView.getLayoutParams();
params.height = totalHeight
        + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1));
myListView.setLayoutParams(params);
// print height of adapter on log
Log.i("height of listItem:", String.valueOf(totalHeight));

}