ListList แนวนอนใน Android?


215

เป็นไปได้ไหมที่จะทำให้เป็นListViewแนวนอน? ฉันทำสิ่งนี้โดยใช้มุมมองแกลเลอรี แต่รายการที่เลือกมาที่กึ่งกลางของหน้าจอโดยอัตโนมัติ ฉันไม่ต้องการรายการที่เลือกในจุดเดียวกับที่ฉันคลิก ฉันจะแก้ไขปัญหานี้ได้อย่างไร ความคิดของฉันคือการตั้งค่าListViewด้วยการเลื่อนแนวนอน แบ่งปันความคิดของคุณ?


1
ใช้ลิงค์นี้ของโพสต์ของฉันเพื่อสร้างแนวนอน listView ฉันหวังว่ามันจะช่วยคุณ
FAIZ ANWAR

2
@Indra ที่บล็อกที่กล่าวถึงถูกลบแล้ว
Animesh Mangla

คุณสามารถตรวจสอบตัวอย่างนี้thedeveloperworldisyours.com/android/…
Cabezas

คำตอบ:


123

ตามเอกสาร Android RecyclerViewเป็นวิธีใหม่ในการจัดระเบียบรายการใน listview และแสดงในแนวนอน

ข้อดี:

  1. ตั้งแต่โดยใช้ Recyclerview Adapter รูปแบบ ViewHolderจะถูกนำไปใช้โดยอัตโนมัติ
  2. แอนิเมชันนั้นใช้งานง่าย
  3. คุณสมบัติอื่น ๆ อีกมากมาย

ข้อมูลเพิ่มเติมเกี่ยวกับRecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

ตัวอย่าง:

survivingwithandroid.com

เพียงเพิ่มบล็อกด้านล่างเพื่อทำให้ListViewแนวนอนจากแนวตั้ง

รหัสข้อมูลโค้ด

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);

1
นี่จะเป็นทางออกที่ดีที่สุดหากปัญหาเกี่ยวกับ LayoutManager ได้รับการแก้ไขโดย google code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai

เพื่อสร้างมุมมองรีไซเคิลอย่างง่าย ๆ ให้ใช้ตัวอย่างนี้: android-examples.com/
..

1
ตกลงวิธีใดสำหรับวิดเจ็ต
Vladislav

ในทางตรงกันข้ามกับมุมมองที่สำรองอะแด็ปเตอร์อื่น ๆ เช่น ListView หรือ GridView, RecyclerView จะอนุญาตให้รหัสลูกค้าจัดเตรียมการจัดวางแบบกำหนดเองสำหรับมุมมองลูก การเตรียมการเหล่านี้ควบคุมโดย RecyclerView.LayoutManager ต้องจัด LayoutManager เพื่อให้ RecyclerView ทำงาน
Yohanes AI

RecyclerView ยังคงไม่สามารถจัดการการคลิกที่รายการ (ไม่พูดถึง RecyclerView คลาสการเลือก) ดีและง่ายเหมือน ListView - นั่นเป็นหนึ่งในเหตุผลไม่กี่ข้อที่ทำไมฉันคิดว่า RecyclerView ไม่ใช่คำตอบที่ดีที่สุดสำหรับคำถามนี้
Edward Quixote

60

พอลไม่ต้องกังวลที่จะแก้ไขข้อบกพร่องของห้องสมุดของเขาหรือยอมรับการแก้ไขของผู้ใช้ นั่นเป็นเหตุผลที่ฉันแนะนำไลบรารีอื่นซึ่งมีฟังก์ชันการทำงานที่คล้ายกัน:

https://github.com/sephiroth74/HorizontalVariableListView

ปรับปรุง : เมื่อวันที่ 24 กรกฎาคม 2013 ผู้เขียน (sephiroth74) เปิดตัวรุ่นที่เขียนใหม่อย่างสมบูรณ์ตามรหัสของ Android 4.2.2 ListView ฉันต้องบอกว่ามันไม่มีข้อผิดพลาดทั้งหมดที่เวอร์ชั่นก่อนหน้านี้ใช้งานได้ดี!


2
นี่ควรเป็นคำตอบที่ยอมรับได้ 'เพราะ HorizontalVariableListView นี้ก้าวหน้ากว่าของพอลมาก ตัวอย่างเช่นมีวิธีการที่เหมาะสมในการเลือกตำแหน่งในรายการพอลมี "สิ่งที่ต้องทำ: ใช้สักวันหนึ่ง" ในที่นั้น
Yan.Yurkin

5
หมายเหตุโซลูชันนี้ต้องใช้ Android 2.3 ขึ้นไป
user1032613

1
HorizontalVariableListView ของ sephiroth74 นั้นเป็นสิ่งที่คุณหวังว่าจะเป็น: สำเนาของ ListView จากซอร์สโค้ด android พร้อมด้วยวิธีการทั้งหมดที่อัปเดตเพื่อย้ายในแนวนอนแทนที่จะเป็นแนวตั้ง ฉันยังไม่พบปัญหาใด ๆ ขอบคุณมากสำหรับการกำกับผมที่นั่น Malachiasz!
SilithCrowe

ดี wrap_content ไปยัง listview ยังไม่ได้รับการสนับสนุนใน lib นี้
Kalpesh Lakhani

1
ตอนนี้มันถูกลบออกแล้ว
Animesh Mangla

28

@Paul ตอบลิงก์ไปยังทางออกที่ยอดเยี่ยม แต่รหัสไม่อนุญาตให้ใช้onClickListenersกับรายการลูก (ฟังก์ชั่นการโทรกลับไม่เคยถูกเรียก) ฉันพยายามหาทางแก้ปัญหามาระยะหนึ่งแล้วและตัดสินใจที่จะโพสต์สิ่งที่คุณต้องแก้ไขในโค้ดนั้น (ในกรณีที่มีคนต้องการ)

แทนการเอาชนะแทนที่dispatchTouchEvent onTouchEventใช้รหัสเดียวกันdispatchTouchEventและลบวิธีการ (คุณสามารถอ่านความแตกต่างระหว่างสองวิธีได้ที่นี่http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

จากนั้นเพิ่มรหัสต่อไปนี้ซึ่งจะตัดสินใจขโมยกิจกรรมจากรายการย่อยและมอบให้กับเราonTouchEventหรือให้พวกเขาจัดการ

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

สุดท้ายอย่าลืมประกาศตัวแปรในชั้นเรียนของคุณ:

private float mInitialX;
private float mInitialY;

13
ทำไมคุณไม่ส่งสิ่งนี้เป็นการร้องขอแบบดึงให้ Paul?
Cristian

ev.getActionMasked () ไม่พร้อมใช้งานบนแพลตฟอร์ม Android 2.1 คุณรู้วิธีที่จะเอาชนะสิ่งนี้หรือไม่?
Eugene Popovich

ดูเหมือนว่าฉันสามารถใช้ int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK ซึ่งแสดงว่าเท่ากับ ev.getMaskedAction ()
Eugene Popovich

มีประโยชน์จริง ๆ ! แต่การเปลี่ยนรหัสเป็น onTouchEvent ฉันได้รับการชดเชยอย่างมาก ฉันเก็บมันไว้ใน dispatchTouchEvent และมันทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณ
jbc25

jbc25 ฉันสามารถยืนยันได้ว่าการกระโดดแปลก ๆ เกิดขึ้นถ้าใช้การแก้ไขนี้
Eugene Popovich

23

เนื่องจาก Google เปิดตัวห้องสมุดสนับสนุน Android v7 21.0.0 คุณสามารถใช้ RecyclerView เพื่อเลื่อนรายการในแนวนอน วิดเจ็ต RecyclerView เป็น ListView เวอร์ชันขั้นสูงและยืดหยุ่นมากขึ้น

หากต้องการใช้ RecyclerView เพียงเพิ่มการพึ่งพา:

com.android.support:recyclerview-v7:23.0.1

นี่คือตัวอย่าง:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

ข้อมูลเพิ่มเติมเกี่ยวกับ RecyclerView:


21

ช้าไปหน่อย (มาก) แต่ฉันจะโพสต์สิ่งนี้ในกรณีที่มีคนเข้ามาทีหลัง

Support Library ซึ่งเป็นแอนดรอยด์ตัวอย่าง L มีRecyclerViewสิ่งที่คุณต้องการอย่างแท้จริง

ตอนนี้คุณสามารถได้รับมันผ่าน SDK L แสดงตัวอย่างและคุณจะต้องตั้งของคุณจะminSdk Lแต่คุณสามารถคัดลอกไฟล์ที่จำเป็นทั้งหมดลงในโครงการของคุณและใช้วิธีนั้นจนกว่า L จะออกอย่างเป็นทางการ

คุณสามารถดาวน์โหลดเอกสารแสดงตัวอย่างที่นี่

คำเตือน: API สำหรับมุมมอง Recycler อาจเปลี่ยนแปลงและอาจมีข้อบกพร่อง

Updated

ซอร์สโค้ดสำหรับ listview แนวนอนคือ:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

สวัสดีมันใช้ได้ไหม เพราะฉันลองแล้วไม่สามารถสร้าง RecyclerView ในแนวนอนได้ คุณสามารถใส่รหัสได้ไหม ขอบคุณ
Cocorico

เพียงแค่ตั้งLinearLayoutManager- ดูที่นี่: stackoverflow.com/questions/28460300/…
Stéphane

19

ดาวน์โหลดไฟล์ jar จากที่นี่

ตอนนี้ใส่ไว้ในโฟลเดอร์ libs ของคุณคลิกขวาแล้วเลือก 'เพิ่มเป็นห้องสมุด'

ตอนนี้ใน main.xml ใส่รหัสนี้

 <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/hlistview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

ตอนนี้ในชั้นเรียนกิจกรรมถ้าคุณต้องการแนวนอน Listview ด้วยภาพแล้วใส่รหัสนี้

  HorizontalListView hListView = (HorizontalListView) findViewById(R.id.hlistview);
    hListView.setAdapter(new HAdapter(this));


 private class HAdapter extends BaseAdapter {

    LayoutInflater inflater;

    public HAdapter(Context context) {
        inflater = LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Const.template.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listinflate, null);
            holder = new HViewHolder();
            convertView.setTag(holder);

        } else {
            holder = (HViewHolder) convertView.getTag();
        }
        holder.img = (ImageView) convertView.findViewById(R.id.image);
        holder.img.setImageResource(Const.template[position]);
        return convertView;
    }

}

class HViewHolder {
    ImageView img;
}

มันไม่รองรับตัวเลือกใด ๆ หรือตัวเลือกที่กำหนดเอง? ความคิดใด ๆ
Nitin Misra

ฉันสามารถเพิ่มอาร์เรย์ของตัวเลขแทนภาพได้หรือไม่
souravlahoti

@BeingSrv ใช่คุณทำได้
Siddhpura Amit

หลังจากใส่ลงในโฟลเดอร์ libs คลิกขวาแล้วกด 'เพิ่มเป็นห้องสมุด'
M. Usman Khan

วิธีการรายชื่อนักพัฒนา horizontallistview เหมือนในชีพจร, bbcnews โปรดช่วยฉัน
Harsha

13

มันง่ายมากจริง ๆ : เพียงหมุนมุมมองรายการเพื่อวางบนด้านข้าง

mlistView.setRotation(-90);

แล้วเมื่อพองเด็กที่ควรจะอยู่ในวิธีการ getView คุณหมุนลูก ๆ เพื่อยืนตัวตรง:

 mylistViewchild.setRotation(90);

แก้ไข: ถ้า ListView ของคุณไม่พอดีหลังจากหมุนให้วาง ListView ไว้ภายในRotateLayoutดังนี้:

 <com.github.rongi.rotate_layout.layout.RotateLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:angle="90"> <!-- Specify rotate angle here -->

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
    </ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>

1
ฉันลองแล้ว - ไม่ง่ายนัก ฉันไม่ได้จัดการให้พอดีกับมุมมองที่หมุนตามความกว้างและความสูงของหน้าจอ และ API นี้มีเฉพาะในอุปกรณ์ใหม่เท่านั้น
Malachiasz

ก่อนหมุนให้ตั้งค่าความกว้างของลิสต์วิวเป็นความสูงของหน้าจอและตั้งค่าความสูงของลิสต์วิวเป็นความกว้างของหน้าจอ .. (นั่นคือถ้าคุณต้องการให้ listview เติมเต็มหน้าจอ) มิฉะนั้นให้ตั้งค่าลิสต์ .
kc ochibili

1
คุณเคยลองสิ่งที่คุณพูดบ้างไหม? ฉันมีและไม่มีของที่ทำงาน
Malachiasz

คุณลองเปลี่ยนค่าหลังจากหมุนหรือไม่ ฉันไม่เห็นว่าทำไมมันไม่ทำงาน (หากคุณสงสัยว่าคุณจะทราบค่าความสูงและความกว้างก่อนหน้านี้หลังจากหมุนได้อย่างไรคุณสามารถบันทึกไว้ในตัวแปรก่อนหมุนแล้วนำไปใช้หลังจากหมุน
kc ochibili

เวอร์ชั่นใหม่ของไลบรารี่นี้ ( stackoverflow.com/a/16589629/2075875 ) ทำงานได้ตามที่ควรและทำงานจาก Android 2.3 ในขณะที่ setRotation () ใช้ได้ตั้งแต่ 3.0 ดังนั้นฉันจึงไม่ต้องการเล่นหมุนอีกครั้ง แต่ฉันสนับสนุน ให้คุณลองด้วยตัวคุณเองและแสดงรหัสการทำงาน
Malachiasz

9

ทางออกของฉันคือใช้ViewPagerวิดเจ็ต มันไม่ได้ล็อคอยู่กึ่งกลางGalleryและมีคุณสมบัติในตัวสำหรับการรีไซเคิลมุมมอง (ตามListView) คุณอาจเห็นแนวทางคล้ายกันที่แอป Google Play ทุกครั้งที่คุณจัดการกับรายการที่เลื่อนได้ในแนวนอน

คุณเพียงแค่ต้องขยายPagerAdapterและทำการปรับแต่งสองสามครั้งที่นั่น:

public class MyPagerAdapter extends PagerAdapter {

    private Context mContext;

    public MyPagerAdapter(Context context) {
        this.mContext = context;
    }

    // As per docs, you may use views as key objects directly 
    // if they aren't too complex
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item, null);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // Important: page takes all available width by default,
    // so let's override this method to fit 5 pages within single screen
    @Override
    public float getPageWidth(int position) {
        return 0.2f;
    }
}

ดังนั้นคุณจะมีวิดเจ็ตเลื่อนแนวนอนพร้อมอะแดปเตอร์ดังนี้: ป้อนคำอธิบายรูปภาพที่นี่


3
มันสามารถเลื่อนได้เหมือน ListView แต่อยู่ในแนวนอน ความแตกต่างที่ฉันเห็น: รายการกำลังเลื่อนแบบหนึ่งต่อหนึ่งดังนั้นจึงไม่สามารถเลื่อนตำแหน่งไปที่กึ่งกลางของรายการถัดไป แต่นั่นเป็นวิธีการทำงานของ ViewPager
fraggjkee

8

หมายเหตุ: ตอนนี้ Android รองรับมุมมองรายการแนวนอนโดยใช้ RecyclerView ดังนั้นตอนนี้คำตอบนี้เลิกใช้แล้วสำหรับข้อมูลเกี่ยวกับ RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

ฉันได้พัฒนาตรรกะในการทำโดยไม่ต้องใช้ไลบรารี่สไลเดอร์แนวนอนภายนอกนี่คือมุมมองแนวนอนที่ฉันทำได้และฉันได้โพสต์คำตอบไว้ที่นี่: https://stackoverflow.com/a/33301582/5479863

คำตอบ json ของฉันคือ:

{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}

ไฟล์เลย์เอาต์:

    <?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"
    android:weightSum="5">    
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <HorizontalScrollView
        android:id="@+id/horizontalScroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">    
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

ไฟล์คลาส:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        for (int v = 0; v < collectionInfo.size(); v++) {
            /*---------------Creating frame layout----------------------*/

            FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
            layoutParams.rightMargin = getPixelsToDP(10);
            frameLayout.setLayoutParams(layoutParams);

            /*--------------end of frame layout----------------------------*/

            /*---------------Creating image view----------------------*/
            final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
            LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
            imgView.setLayoutParams(lpImage);
            // setting ID to retrieve at later time (same as its position)
            imgView.setId(v);
            imgView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // getting id which is same as its position
                    Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
                    // getting selected category's data list
                    new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
                }
            });
            /*--------------end of image view----------------------------*/

            /*---------------Creating Text view----------------------*/
            TextView textView = new TextView(ActivityMap.this);//create textview dynamically
            textView.setText(collectionInfo.get(v).getCatName());
            FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
            // Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
            textView.setTextColor(Color.parseColor("#43A047"));
            textView.setLayoutParams(lpText);
            /*--------------end of Text view----------------------------*/

            //Adding views at appropriate places
            frameLayout.addView(imgView);
            frameLayout.addView(textView);
            linearLayout.addView(frameLayout);

        }

 private int getPixelsToDP(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        int pixels = (int) (dp * scale + 0.5f);
        return pixels;
    }

เคล็ดลับที่ทำงานที่นี่เป็นรหัสที่ฉันได้กำหนดให้กับ ImageView "imgView.setId (v)" และหลังจากนั้นใช้ onClickListener เพื่อที่ฉันดึงรหัสของมุมมองอีกครั้งฉันยังได้แสดงความคิดเห็นภายในรหัสดังนั้น เข้าใจง่ายฉันหวังว่านี่อาจจะมีประโยชน์มาก ... Happy Coding ... :)

http://i.stack.imgur.com/lXrpG.png


1
ฉันได้แก้ไขและโพสต์คำอธิบายแบบสมบูรณ์ที่นี่แล้วขอบคุณสำหรับคำแนะนำ :)
Abdul Aziz

สวัสดีขอบคุณสำหรับรหัสของคุณคุณสามารถโพสต์วิธีการgetPixelsToDP()?
Skizo-ozᴉʞS

@Skizo ฉันได้เพิ่มวิธีการที่ส่วนท้ายของรหัส java ได้ดู
Abdul Aziz

6

นี่ไม่ใช่คำตอบที่มากนัก แต่วิธีการใช้มุมมองเลื่อนแนวนอน ?


3
มันได้ผล. แต่ถ้าฉันมีรายการจำนวนมากก็ไม่สามารถใช้ชนิดของอะแดปเตอร์และคลิกเหตุการณ์
Praveen


5

คุณสามารถใช้ RecyclerView ในไลบรารีการสนับสนุน RecyclerView เป็น ListView เวอร์ชันทั่วไปที่รองรับ:

  • เครื่องมือจัดการโครงร่างสำหรับวางตำแหน่งรายการ
  • ภาพเคลื่อนไหวเริ่มต้นสำหรับการดำเนินการรายการทั่วไป

Android Recycler ดูเอกสาร


นี่คือคำตอบที่แท้จริง ณ วันที่นี้ แต่สิ่งนี้ยังไม่พร้อมและยังอยู่ใน 'ตัวอย่าง'
มาร์ติน

3

ฉันทำการค้นหาวิธีแก้ไขปัญหานี้มาหลายครั้งแล้ว คำตอบสั้น ๆ คือไม่มีวิธีแก้ปัญหาที่ดีโดยไม่ต้องเอาชนะวิธีการส่วนตัวและสิ่งต่าง ๆ AdapterViewสิ่งที่ดีที่สุดที่ฉันพบคือการดำเนินการด้วยตัวเองตั้งแต่เริ่มต้นโดยการขยาย มันค่อนข้างน่าสมเพช ดูของฉันคำถามเกี่ยวกับ listviews


น่าเศร้าที่คำตอบของคุณคือคำตอบที่ถูกต้อง แม้แต่ Google ก็ยืนยันว่าวิธีเดียวสำหรับ listview แนวนอนคือแกลเลอรี แต่คลังภาพไม่เหมือนกับมุมมองแนวนอน คุณยินดีที่จะแบ่งปันรหัสของคุณหรือไม่ คุณรีไซเคิลมุมมองหรือไม่
Patrick Boos

1
น่าเสียดายที่รหัสนั้นเขียนขึ้นสำหรับ บริษัท ของฉันดังนั้นจึงเป็นกรรมสิทธิ์ อย่างไรก็ตามฉันหวังว่าจะหาเวลาว่างในอีกไม่กี่เดือนข้างหน้าเพื่อเขียนใหม่ (การใช้งานดั้งเดิมค่อนข้างไม่เสถียร) และเผยแพร่ไปยังโดเมนสาธารณะ ฉันสามารถบอกคุณได้ว่าฉันเริ่มต้นด้วยการสาธิตนี้จาก Sony Ericsson เปลี่ยน 'x' เป็น 'y' และ 'width' เป็น 'height' ทั้งหมด จากนั้นฉันก็ลบการแปลง 3D และเพิ่มพฤติกรรมการหยุดที่จุดสิ้นสุด
Neil Traft

@Neil Traft คุณแก้ไขตำแหน่งรายการอย่างไร แล้วหยุดในที่สุดล่ะ?
Adrian Magdas

จริงๆแล้วมันเป็นแค่การคาดเดามากมาย ใช้เวลานานในการทำให้ถูกต้องและฉันเชื่อว่ามีวิธีที่ดีกว่า แต่หลักฐานขั้นพื้นฐานคือในfillListDown()วิธีนี้คุณจะต้องติดตามขอบด้านล่างของรายการสุดท้าย แต่คุณไม่ทราบว่าขอบนั้นอยู่ที่ไหนจนกว่าคุณจะสร้างรายการสุดท้าย (adapter.getCount () - 1) ดังนั้นคุณจะรอจนกว่าจะมีการสร้างรายการนั้นและจากนั้นคุณสามารถจัดเก็บตำแหน่งของขอบ เมื่อคุณทราบแล้วคุณสามารถมั่นใจได้ว่า mListTop ไม่น้อยกว่า 0 และไม่สูงกว่าความสูงของรายการ
Neil Traft

1
ถ้าคุณทำไม่ได้จริงๆแล้วแน่นอนต้องมีรายการแนวนอนฉันขอแนะนำให้คุณเลิกใช้หรือใช้แกลเลอรี
Neil Traft

3

ฉันต้องทำเช่นเดียวกันสำหรับหนึ่งในโครงการของฉันและฉันก็ลงเอยด้วยการเขียนของตัวเองเช่นกัน ฉันเรียกมันว่าHorzListViewตอนนี้เป็นส่วนหนึ่งของไลบรารีAniqroidโอเพ่นซอร์สของฉัน

http://aniqroid.sileria.com/doc/api/ (มองหาการดาวน์โหลดที่ด้านล่างหรือใช้ google code project เพื่อดูตัวเลือกการดาวน์โหลดเพิ่มเติม: http://code.google.com/p/aniqroid/downloads/list )

เอกสารประกอบการเรียนอยู่ที่นี่: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


ฉันจะตั้งตำแหน่งเลื่อนโดยทางโปรแกรมได้อย่างไร
Dima Portenko

setSelection () วิธีการมี แต่อาจจะไม่ได้รับการดำเนินการ 100% ลองมัน.
Sileria

1

สำหรับแอปพลิเคชันของฉันฉันใช้ HorizontalScrollView ที่มี LinearLayout ภายในซึ่งมีการวางแนวเป็นแนวนอน ในการเพิ่มภาพภายในฉันสร้าง ImageViews ภายในกิจกรรมและเพิ่มลงใน LinearLayout ของฉัน ตัวอย่างเช่น:

<HorizontalScrollView 
        android:id="@+id/photo_scroll"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="horizontal"
        android:visibility="gone">

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

        </LinearLayout>
    </HorizontalScrollView>

นี่มันใช้งานได้ดีอย่างสมบูรณ์แบบสำหรับฉัน ในกิจกรรมทั้งหมดที่ฉันต้องทำคือสิ่งที่ชอบรหัสด้านล่าง:

LinearLayout imgViewHolder = findViewById(R.id.imageview_holder);
ImageView img1 = new ImageView(getApplicationContext());
//set bitmap
//set img1 layout params
imgViewHolder.add(img1);
ImageView img2 = new ImageView(getApplicationContext());
//set bitmap
//set img2 layout params
imgViewHolder.add(img2); 

อย่างที่ฉันบอกว่ามันเหมาะกับฉันและฉันหวังว่ามันจะช่วยให้ใครบางคนกำลังมองหาที่จะบรรลุเป้าหมายนี้เช่นกัน


0

คุณสามารถสร้าง textviews ฯลฯ แบบไดนามิกได้ตลอดเวลาและตั้งค่าตัวเลือกรายการตรวจสอบอย่างที่คุณต้องการด้วยอะแดปเตอร์


คุณหมายถึงอะไร ฉันไม่สามารถรับคุณ โปรดโพสต์โค้ดเกี่ยวกับความคิดของคุณหรือไม่
Praveen

โปรดบอกวัตถุประสงค์ของ "มุมมองแนวนอน" ที่จะมีมุมมองที่ซับซ้อน / หลายมุมมองหรือไม่ เช่น 2 textboxes 1 progressbar? หรือสมมุติว่าข้อความธรรมดาหรือไม่คุณมีองค์ประกอบจำนวนคงที่ในมุมมองนั้นหรือคุณต้องการเปลี่ยนเป็นแบบไดนามิกหรือไม่ ตอบคำถามเหล่านี้ให้ฉันและฉันจะสามารถช่วยคุณเกี่ยวกับรหัส
weakwire

ฉันต้องการที่จะทำแกลเลอรี่ข้อความแนวนอน แต่รายการที่เลือกมาถึงศูนย์เป็นค่าเริ่มต้น ฉันต้องการที่จะเป็นรายการที่เลือกจะต้องเป็นที่ฉันคลิกที่ โปรดตรวจสอบการโพสต์ของฉัน: stackoverflow.com/questions/3237566/text-gallery-on-android และ stackoverflow.com/questions/3318617/…
Praveen

0

HorizontialListView ไม่สามารถทำงานได้เมื่อข้อมูลในอะแดปเตอร์เกี่ยวข้องในเธรดอื่น ทุกอย่างทำงาน 100% บนเธรด UI นี่เป็นปัญหาใหญ่ในมัลติเธรด ผมคิดว่าการใช้ HorizontialListView ไม่ได้เป็นทางออกที่ดีที่สุดสำหรับ problem.HorzListView ของคุณจะดีขึ้น way.You เพียงแทนที่แกลลอรี่ก่อนหน้านี้ของคุณด้วย HorzListView.You neednot ปรับเปลี่ยนรหัสเกี่ยวกับทุกอย่าง adapter.Then ไปในแบบที่คุณ hope.See https: // stackoverflow.com/a/12339708/1525777เกี่ยวกับ HorzListView


0

ฉันใช้ ลิงค์ listview แนวนอนในโครงการของฉัน & ฉันได้รับผลลัพธ์ที่ดี ฉันเคยใช้ห้องสมุดdevsmart มาก่อน แต่มันทำให้ฉันมีปัญหา ดังนั้นวิธีที่ดีที่สุดในการใช้ลิงค์ listview แนวนอนเนื่องจากมันสามารถแก้ไขปัญหาของฉันและฉันเพิ่งเปิดตัวแอปของฉันใน Google PlayStore โดยใช้ห้องสมุดนี้ & ได้รับการตอบรับที่ดีจากผู้ใช้ ดังนั้นฉันขอแนะนำให้คุณใช้ไลบรารีเดียวกันกับที่ฉันได้กล่าวไว้ข้างต้นเพื่อแสดง listview ในแนวนอน สนุก :)


0

มีห้องสมุดที่ดีสำหรับการที่เรียกว่าเป็นTwoWayViewมันเป็นเรื่องง่ายมากที่จะใช้เพียงแค่ ได้แก่ ห้องสมุดโครงการเข้ามาในพื้นที่การทำงานของคุณและเพิ่มเป็นโครงการห้องสมุดให้กับโครงการเดิมของคุณและจากนั้นทำตามขั้นตอนต่อไปนี้ซึ่งเดิมกล่าวถึงที่นี่ :

ก่อนอื่นเรามาเพิ่มสไตล์ที่ระบุการวางแนวของ ListView (แนวนอนหรือแนวตั้ง) ใน (res / values ​​/ styles.xml):

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

จากนั้น

ใน XML โครงร่างของคุณใช้รหัสต่อไปนี้เพื่อเพิ่ม TwoWayView:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

และในที่สุดก็ประกาศและจัดการกับมันเหมือนปกติListView:

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

ทุกวิธีการของListViewการทำงานจะอยู่ที่นี่ตามปกติ แต่มีเพียงหนึ่งความแตกต่างที่ผมสังเกตเห็นซึ่งเมื่อตั้งค่าโหมดการเลือกวิธีการที่setChoiceModeไม่ได้ใช้เวลาintคุ้มค่า แต่ค่าจากenumเรียกว่าChoiceModeดังนั้นจะlist_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE


1
ฉันลองสิ่งนี้ - แต่มันจะไม่ยอมให้ฉันใช้ ArrayAdapter ของฉันเอง <PreviewImage>
DeNitE Appz

-1

คุณสามารถใช้ ViewFlipper เพื่อรวมเค้าโครง XML และเพิ่มรูปภาพ, listview สำหรับแต่ละเค้าโครง XML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.