Rolování s více ListViews pro Android

hlasů
32

Jsem zcela pařezy na tento jeden. Mám tři různé seznamy, které musí být zobrazeny na obrazovce. Je zcela možné, že tyto seznamy budou přesahovat spodním okraji obrazovky, takže budu potřebovat rolování.

Snažil jsem pomocí ScrollViews LinearLayoutdítětem, a uvedení mého ListViewsv LinearView, ale všechny ListViewszámku na pevnou výškou s posuvníky. Vzájemné působení s dalšími druhy rozvržení znamená bez posouvání.

Má někdo nějaké návrhy, nebo budu muset programově přidat položky seznamu do určité rozložení a doufat v nejlepší?

Položena 20/11/2008 v 20:55
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
11

Vpřed touch událost z touchedpohledu na jiných pohledech. Všechny vaše názory budou synchronizovány rozbalit / zhroutil taky.

   OnTouchListener mOnTouch = new OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {            
            MotionEvent newEvent = MotionEvent.obtain(event);
            switch(event.getAction()){  
            case MotionEvent.ACTION_MOVE:
                if(mTouched == null){
                    mTouched = v;
                }
                mMovingFlag = true;
                break;
            case MotionEvent.ACTION_UP:
                if(mMovingFlag==false){
                    newEvent.setAction(MotionEvent.ACTION_CANCEL);
                }
                mMovingFlag = false;
                break;
            default:
                mMovingFlag = false;
                if(mTouched != null && mTouched.equals(v)){
                    mTouched = null;
                }
                break;

            }
            if(mTouched == null || mTouched.equals(v)){
                int items = mLayoutWithListViews.getChildCount();
                for(int list=0; list<items; list++){
                    AbsListView listView =mLayoutWithListViews.getChildAt(list));
                    if(listView != v){
                         listView.onTouchEvent(newEvent);
                    }
                }
            }
            return false;
        }
    };
Odpovězeno 29/06/2011 v 15:53
zdroj uživatelem

hlasů
6

Měl jsem podobný problém úspory, které jsem měl dva GridViews a jeden ListView pohybovat. Vyřešil jsem to ručním nastavením výšky ListViews a GridView:

    ListAdapter listAdapter = listView.getAdapter();

    int rows = listAdapter.getCount() / columns;
    int height = 60 * rows; // Insert the general cell height plus the dividers.

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = height;
    listView.setLayoutParams(params);
    listView.requestLayout();

Doufají, že jsem mohl pomoci někoho jiného.

Odpovězeno 26/02/2011 v 14:16
zdroj uživatelem

hlasů
6

Neudělal jsem to ještě, ale přemýšlel jsem o tom, protože budu asi muset udělat. Neumím si představit tři možnosti: použít pouze jeden seznam s obsahem všech seznamech. Můžete vytvořit ListAdapter, který dělá to a vloží nějaké hlavičky. To by pravděpodobně mohlo být něco velmi opakovaně použitelné.

Druhou myšlenkou je, aby seznam seznamů. Ale to zní jako koleduje o malér.

Odpovězeno 12/01/2009 v 10:58
zdroj uživatelem

hlasů
3

Ačkoli toto řešení je pro scroll pohled namísto zobrazení seznamu je, že problém je stejný, a toto řešení funguje dobře pro mě. Rolování levý scrollview bude rolovat správný scrollview a naopak.

 public class MainActivity extends Activity implements OnTouchListener {
    private ScrollView scrollViewLeft;
    private ScrollView scrollViewRight;
    private static String LOG_TAG = MainActivity.class.getName();
    private boolean requestedFocus = false;

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

        scrollViewLeft = (ScrollView) findViewById(R.id.scrollview_left);
        scrollViewRight = (ScrollView) findViewById(R.id.scrollview_right);

        scrollViewLeft.setOnTouchListener(this);
        scrollViewRight.setOnTouchListener(this);

        scrollViewLeft.setFocusableInTouchMode(true);
        scrollViewRight.setFocusableInTouchMode(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        Log.d(LOG_TAG, "--> View, event: " + view.getId() + ", " + motionEvent.getAction() + ", " + view.isFocused());
        Log.d(LOG_TAG, "--> " + scrollViewLeft.isFocused() + ", " + scrollViewRight.isFocused());

        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && requestedFocus == false){
            view.requestFocus();
            requestedFocus = true;
        }else if (motionEvent.getAction() == MotionEvent.ACTION_UP){
            requestedFocus = false;
        }

        if (view.getId() == R.id.scrollview_left && view.isFocused()){
            scrollViewRight.dispatchTouchEvent(motionEvent);
        }else if (view.getId() == R.id.scrollview_right && view.isFocused()){
            scrollViewLeft.dispatchTouchEvent(motionEvent);
        }

        return super.onTouchEvent(motionEvent);
    }
}
Odpovězeno 10/09/2012 v 19:53
zdroj uživatelem

hlasů
1
ListAdapter listAdapter = listView.getAdapter();
int rows = listAdapter.getCount() / columns;
 int height = 60 * rows; // Insert the general cell height plus the dividers.
 ViewGroup.LayoutParams params = listView.getLayoutParams();
 params.height = height;
 listView.setLayoutParams(params);
 listView.requestLayout();
Odpovězeno 17/09/2015 v 07:25
zdroj uživatelem

hlasů
-1

Použijte rozšiřitelnou ListView. CHK svou odpověď na podobnou otázku zde: Android ScrollView layout problém

Odpovězeno 04/10/2010 v 05:55
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more