programing

안드로이드에서 수평 리스트뷰를 만들려면 어떻게 해야 합니까?

bestprogram 2023. 9. 24. 13:00

안드로이드에서 수평 리스트뷰를 만들려면 어떻게 해야 합니까?

중복 가능:
Android에서 수평 리스트 보기?

Android의 많은 것들처럼, 당신은 이것이 그렇게 어려운 문제가 될 것이라고 생각하지 않을 것입니다만, 오, 세상에, 당신이 틀리겠어요.그리고 안드로이드의 많은 것들과 마찬가지로 API는 합리적으로 확장 가능한 시작점조차 제공하지 못합니다.내가 원하는 것은 물건을 가져가서 옆으로 돌리는 것뿐인데, 내가 ListView를 롤업하려고 한다면 나는 망할 것입니다.\rant

좋아요, 이제 화가 났으니 문제 자체에 대해 얘기해보죠.입니다.Gallery 잠금 이 없다면 잠금 ListView의 목록 Selector를 선택합니다. 하지만 그것은 가지고 있기 좋습니다.대부분은 내가 하고 싶은 일을 할 수 있었습니다.LinearLayout안에ScrollView의 견해가 a, 으로부터 .ListAdapter저는 뷰 리사이클러를 정말 갖고 싶습니다.그리고 레이아웃 코드는 정말 쓰고 싶지 않습니다.

이 수업들의 소스코드를 들여다봤는데...

갤러리:대부분의 'onXyz' 메서드를 무시하고 소스 코드를 모두 복사하지만 통화를 자제하면 갤러리를 사용할 수 있을 것 같습니다.scrollIntoSlots()하지만 치 못한 하게 될이라고 확신합니다 하지만 그렇게 하면 접근이 불가능하거나 예상치 못한 다른 결과를 초래할 수 있는 회원 분야에 확신합니다.

앱스스피너: Since themRecycler저는 이 수업을 연장할 수 있을지 의문입니다.

AbsListView:이 수업은 세로 스크롤만을 위한 수업인 것 같으니 도움이 안 됩니다.

어댑터 보기:저는 이 수업을 직접 연장할 필요가 없었습니다.그게 쉽다고, 내 것을 굴리는 것이 쉽다고 말한다면,RecycleBin는 굉장히번 해보겠습니다 .

다 복사할 수 있을 것 같아요 AbsSpinner그리고.Gallery내가 원하는 걸 얻기 위해서...제가 접근할 수 없는 패키지-프라이빗 변수를 사용하지 않기를 바랍니다.그게 좋은 연습이라고 생각하세요?저에게 올바른 방향을 제시해 줄 수 있는 튜토리얼이나 타사 솔루션이 있는 사람이 있습니까?

:
제가 지금까지 찾은 유일한 해결책은 제가 직접 하는 것입니다.이 을 한 로,했습니다를 .AdapterView저만의 "Horizontal ListView"를 처음부터 구현했습니다. 무시할 수 입니다를 입니다.scrollIntoSlots실행 시 서브클래스 생성이 필요할 것으로 생각되는 method.그렇게 할 수 있을 정도로 대담하다면, 그것이 거의 틀림없이 최고의 해결책이지만, 저는 변화할 수 있는 문서화되지 않은 방법에 의존하고 싶지 않습니다.

가 의 Swathi EP에게 는를 줄 했습니다.GalleryOnTouchListener스크롤 기능을 무시합니다.목록에 썸 지원이 있는 것을 신경 쓰지 않거나 썸 애니메이션이 끝날 때 뷰가 가운데로 튀어 나와도 괜찮다면 이 방법이 효과적일 입니다!그러나 결국 플링 서포트를 제거하지 않고는 센터 잠금 기능을 제거할 수 없습니다.그리고 물어봅니다, 어떤 리스트가 안 나와요?

그래서 아아, 이건 내게 효과가 없었어요. :-( 하지만 이 접근법에 관심이 있다면, 읽어보세요...

내가 원하는 것을 얻기 위해 스와티의 코드를 추가해야 했습니다.GestureListener.onTouch만 아니라, 에, 에 .ACTION_UP그리고.ACTION_CANCEL사건. 잠금 기능을 으로 비활성화시켰지만, 또한 시켰습니다.이를 통해 센터 잠금 기능을 사용할 수 있게 되었지만 플링도 사용할 수 없게 되었습니다.제 제스처 다에 활성화할 수 .onFling방법. 를 다음 .사용해 보고 싶다면 ApiDemos 샘플 코드로 들어가 Gallery1.java 클래스를 다음 코드로 대체합니다.

import com.example.android.apis.R;

import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;

public class Gallery1 extends Activity {

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

        // Reference the Gallery view
        final Gallery g = (Gallery) findViewById(R.id.gallery);

        // Set the adapter to our custom adapter (below)
        g.setAdapter(new ImageAdapter(this));

        // Set a item click listener, and just Toast the clicked position
        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView parent, View v, int position, long id) {
                Toast.makeText(Gallery1.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });

        // Gesture detection
        final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector(g));
        OnTouchListener gestureListener = new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                boolean retVal = gestureDetector.onTouchEvent(event);
                int action = event.getAction();
                if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
                    retVal = true;
                    onUp();
                }
                return retVal;
            }

            public void onUp() {
                // Here I am merely copying the Gallery's onUp() method.
                for (int i = g.getChildCount() - 1; i >= 0; i--) {
                    g.getChildAt(i).setPressed(false);
                }
                g.setPressed(false);
            }
        };
        g.setOnTouchListener(gestureListener);

        // We also want to show context menu for longpressed items in the gallery
        registerForContextMenu(g);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        menu.add(R.string.gallery_2_text);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        Toast.makeText(this, "Longpress: " + info.position, Toast.LENGTH_SHORT).show();
        return true;
    }

    public class ImageAdapter extends BaseAdapter {
        int mGalleryItemBackground;

        public ImageAdapter(Context c) {
            mContext = c;
            // See res/values/attrs.xml for the <declare-styleable> that defines
            // Gallery1.
            TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
            mGalleryItemBackground = a.getResourceId(
                    R.styleable.Gallery1_android_galleryItemBackground, 0);
            a.recycle();
        }

        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            i.setImageResource(mImageIds[position]);
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setLayoutParams(new Gallery.LayoutParams(136, 88));

            // The preferred Gallery item background
            i.setBackgroundResource(mGalleryItemBackground);

            return i;
        }

        private Context mContext;

        private Integer[] mImageIds = {
                R.drawable.gallery_photo_1,
                R.drawable.gallery_photo_2,
                R.drawable.gallery_photo_3,
                R.drawable.gallery_photo_4,
                R.drawable.gallery_photo_5,
                R.drawable.gallery_photo_6,
                R.drawable.gallery_photo_7,
                R.drawable.gallery_photo_8
        };
    }

    public class MyGestureDetector extends SimpleOnGestureListener {

        private Gallery gallery;

        public MyGestureDetector(Gallery gallery) {
            this.gallery = gallery;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
                float velocityY) {
            return gallery.onFling(e1, e2, velocityX, velocityY);
        }
    }

}

했습니다를 ListView. 여기에서 확인하실 수 있습니다. http://dev-smart.com/horizontal-listview/ 도움이 되는지 알려주세요.

목록 항목을 랩핑하기 위해 HorizontalScrollView를 사용하는 방법을 알아보셨습니까?그러면 각 목록 항목을 수평으로 스크롤할 수 있습니다(여기에 입력하는 항목은 사용자의 몫이며 목록 보기와 유사한 동적 항목으로 만들 수 있습니다).한 줄의 항목만 사용하는 경우 이 방법이 효과적입니다.

기존의 ListView를 사용할 수도 있습니다. 약간의 신중한 재정의가 있습니다.dispatchDraw() 90도 (캔버스를하려면),onTouch()(MotionEvent 좌표의 X와 Y를 맞바꾸려면) 그리고 Measure()에 있을 수도 있고, 아니면 그것이 x y가 아니라 x y라고 생각하도록 속일 수도 있습니다...

이게 실제로 효과가 있을지는 모르겠지만 알아보면 재미있을 것 같습니다.:)

이것은 매우 늦은 답변일 수도 있지만 우리에게 효과가 있습니다.안드로이드에서 제공하는 것과 같은 갤러리를 사용하고 있는데, 다만 화면 왼쪽 끝이 갤러리의 중심으로 간주되도록 왼쪽 여백을 조정했습니다.정말 잘 먹혔네요.

Pauls (그의 답변 참조) Implementation of Horizontal Listview를 사용했는데 효과가 있습니다. 공유해주셔서 정말 감사합니다!

저는 그의 HorizontalListView-Class(btw)를 약간 변경했습니다.폴, 클래스 이름에 오타가 있습니다. 클래스 이름은 "HorizontalListView" 대신 "HorizontalListView"입니다. "i"가 너무 많아요)를 선택하면 하위 보기를 업데이트할 수 있습니다.

업데이트: 제가 여기에 올린 코드가 잘못된 것 같습니다. 선택에 문제가 생겨서(보기 재활용과 관련이 있는 것 같습니다), 다시 도면으로 돌아가야 할 것 같습니다.

업데이트 2: 네 문제가 해결되었습니다. 저는 "비가시 제거"라고 간단히 언급했습니다.항목(dx);" on Layout(..)"의 경우 성능에 문제가 없을 것으로 예상됩니다. 하지만 저는 매우 작은 목록만 사용하기 때문에 문제가 없습니다.

저는 기본적으로 개발자 생활에 대한 이 자습서를 사용하여 ListView를 Pauls HorizontalListView로 교체하고 "영구적" 선택(클릭한 어린이는 모양을 변경하고 다시 클릭하면 다시 변경함)을 허용하도록 변경했습니다.

저는 초보자라서 아마 코드에 못난 것들이 많으실 거예요, 자세한 내용이 필요하시면 말씀해주세요.

갤러리가 최고의 솔루션입니다, 제가 해봤습니다.저는 목록 보기로 표시된 받은 편지함에 있는 메일을 목록 보기로 표시하는 메일 앱 하나에서 작업하고 있었습니다. 목록 보기를 갤러리로 변환했을 뿐이며 오류 없이 필요에 따라 모든 것이 잘 작동했습니다.스크롤 효과의 경우 갤러리의 제스처 수신기를 활성화했습니다.이 답변이 도움이 되기를 바랍니다.

ViewFlipper 구성 요소에 대해 알아보셨습니까?도움이 될 수도 있겠군요

http://developer.android.com/reference/android/widget/ViewFlipper.html

이 구성 요소를 사용하면 두 개 이상의 뷰 자식을 첨부할 수 있습니다.번역 애니메이션을 추가하고 제스처 감지를 캡처하면 멋진 가로 스크롤을 얻을 수 있습니다.

내 앱은 포트레인 모드에서 ListView를 사용하며, 단순히 가로 모드에서 Gallery로 전환됩니다.둘 다 하나의 기본 어댑터를 사용합니다.이것은 아래와 같습니다.

       setContentView(R.layout.somelayout);
       orientation = getResources().getConfiguration().orientation;

       if ( orientation == Configuration.ORIENTATION_LANDSCAPE )
       {

            Gallery gallery = (Gallery)findViewById( R.id.somegallery );

            gallery.setAdapter( someAdapter );

            gallery.setOnItemClickListener( new OnItemClickListener() {
            @Override
            public void onItemClick( AdapterView<?> parent, View view,
                    int position, long id ) {

                onClick( position );
            }
        });
       }
       else
       {
            setListAdapter( someAdapter );

            getListView().setOnScrollListener(this);
       }    

스크롤 이벤트를 처리하려면 갤러리에서 고유 위젯을 상속하고 Fling()을 재정의합니다.layout.xml:

    <view 
    class="package$somegallery"
    android:id="@+id/somegallery" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent">
    </view>

코드:

    public static class somegallery extends Gallery
    {
        private Context mCtx;

        public somegallery(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            mCtx = context;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {

            ( (CurrentActivity)mCtx ).onScroll();

            return super.onFling(e1, e2, velocityX, velocityY);
        }
   }

언급URL : https://stackoverflow.com/questions/3877040/how-can-i-make-a-horizontal-listview-in-android