ListView ngang trong Android?


215

Có thể làm ListViewtheo chiều ngang? Tôi đã thực hiện điều này bằng cách sử dụng chế độ xem thư viện, nhưng mục được chọn sẽ tự động đến giữa màn hình. Tôi không muốn mục được chọn tại cùng một điểm tôi đã nhấp. Làm thế nào tôi có thể khắc phục vấn đề này? Ý tưởng của tôi là thiết lập ListViewvới một cuộn ngang. Chia sẻ ý tưởng của bạn?


1
sử dụng liên kết này của bài viết của tôi để tạo Danh sách ngang Xem tôi hy vọng nó sẽ giúp bạn.
FAIZ ANWAR

2
@ Nội địa mà blog bạn đề cập đã bị xóa
Animesh Mangla

Bạn có thể kiểm tra ví dụ này thedeveloperworldisyours.com/android/ Kẻ
Cabezas

Câu trả lời:


123

Theo Tài liệu Android RecyclerViewlà cách mới để sắp xếp các mục trong listview và được hiển thị theo chiều ngang

Ưu điểm:

  1. Vì bằng cách sử dụng Bộ chuyển đổi Recyclerview, mẫu ViewHolder được tự động triển khai
  2. Hoạt hình rất dễ thực hiện
  3. Nhiều tính năng hơn

Thông tin thêm về RecyclerView:

  1. Grokkingandroid.com
  2. antonioleiva.com

Mẫu vật:

Survivingwithandroid.com

Chỉ cần thêm khối bên dưới để làm ListViewcho chiều ngang từ dọc

Đoạn mã

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

1
Đây sẽ là giải pháp tốt nhất nếu các vấn đề với LayoutManager được sửa bởi google. code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai

để xây dựng một cái nhìn đơn giản tái chế, sử dụng ví dụ này: android-examples.com/...
Matcoil

1
Ok, cách nào cho các vật dụng?
Vladislav

Trái ngược với các chế độ xem được hỗ trợ bởi bộ điều hợp khác như ListView hoặc GridView, RecyclerView cho phép mã máy khách cung cấp các sắp xếp bố cục tùy chỉnh cho các chế độ xem con. Các sắp xếp này được kiểm soát bởi RecyclerView.LayoutManager. Một trình quản lý bố cục phải được cung cấp cho RecyclerView để hoạt động.
Yohanes AI

RecyclerView vẫn không thể xử lý các nhấp chuột vào các mục (không đề cập đến lớp RecyclerView.Selection) tốt và dễ dàng như ListView - đó là một trong vài lý do tại sao tôi nghĩ RecyclerView không phải là câu trả lời tốt nhất cho câu hỏi này.
Edward Quixote

60

Paul không bận tâm sửa lỗi thư viện của mình hoặc chấp nhận sửa lỗi của người dùng. Đó là lý do tại sao tôi đề xuất một thư viện khác có chức năng tương tự:

https://github.com/sephiroth74/HTHERVariableListView

Cập nhật : vào ngày 24 tháng 7 năm 2013, tác giả (sephiroth74) đã phát hành phiên bản viết lại hoàn toàn dựa trên mã của Android 4.2.2 ListView. Tôi phải nói rằng nó không có tất cả các lỗi mà phiên bản trước có và hoạt động rất tốt!


2
Đây phải là một câu trả lời được chấp nhận, vì điều này là ReverseVariableListView tiên tiến hơn nhiều so với câu trả lời của Paul. Ví dụ: nó có một phương pháp thích hợp để chọn vị trí trong danh sách, thì Paul có "TODO: thực hiện một ngày nào đó" ở vị trí đó.
Yan.Yurkin

5
Lưu ý giải pháp này yêu cầu Android 2.3 trở lên
user1032613

1
Sephiroth74 'ngangVariableListView chính xác là những gì bạn hy vọng nó là: Một bản sao của ListView từ mã nguồn Android với tất cả các phương thức được cập nhật để di chuyển theo chiều ngang thay vì theo chiều dọc. Tôi chưa gặp phải bất kỳ vấn đề nào. Cảm ơn bạn rất nhiều vì đã chỉ dẫn tôi ở đó, Malachiasz!
SilithCrowe

well quấn_content để listview vẫn không được hỗ trợ trong lib này
Kalpesh Lakhani

1
Nó được mô tả ngay bây giờ
Animesh Mangla

28

@Paul trả lời liên kết đến một giải pháp tuyệt vời, nhưng mã không cho phép sử dụng onClickListener trên các mục con (các hàm gọi lại không bao giờ được gọi). Tôi đã vật lộn một thời gian để tìm giải pháp và tôi đã quyết định đăng lên đây những gì bạn cần sửa đổi trong mã đó (trong trường hợp ai đó cần nó).

Thay vì dispatchTouchEventghi đè onTouchEvent. Sử dụng cùng một mã dispatchTouchEventvà xóa phương thức (bạn có thể đọc sự khác biệt giữa hai ở đây http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )

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

Sau đó, thêm mã sau đây sẽ quyết định đánh cắp sự kiện từ các mục con và đưa nó cho chúng tôi onTouchEventhoặc để chúng được xử lý bởi chúng.

@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);
    }
}

Cuối cùng, đừng quên khai báo các biến trong lớp của bạn:

private float mInitialX;
private float mInitialY;

13
Tại sao bạn không gửi điều này như một yêu cầu kéo đến Paul?
Cristian

ev.getActionMasked () không khả dụng trên nền tảng Android 2.1. Bạn có biết làm thế nào để vượt qua điều này?
Eugene Popovich

dường như tôi có thể sử dụng int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK sẽ tương đương với ev.getMaskedAction ()
Eugene Popovich

Thực sự hữu ích! nhưng thay đổi mã thành onTouchEvent tôi đã có một phần bù lớn hơn. Tôi đã giữ nó trong ClarkTouchEvent và nó hoạt động hoàn hảo! Cảm ơn
jbc25

jbc25 tôi có thể xác nhận rằng những cú nhảy kỳ lạ xảy ra nếu sử dụng cách khắc phục này
Eugene Popovich

23

Kể từ khi Google giới thiệu Thư viện hỗ trợ Android v7 21.0.0, bạn có thể sử dụng RecyclerView để cuộn các mục theo chiều ngang. Tiện ích RecyclerView là phiên bản ListView tiên tiến và linh hoạt hơn.

Để sử dụng RecyclerView, chỉ cần thêm phụ thuộc:

com.android.support:recyclerview-v7:23.0.1

Đây là một mẫu:

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);
    }
}

Thông tin thêm về RecyclerView:


21

Đây là một chút (rất) muộn, nhưng tôi sẽ đăng nó trong trường hợp ai đó đến sau này.

Thư viện hỗ trợ như bản xem trước Android L có một RecyclerViewthứ thực hiện chính xác những gì bạn muốn.

Ngay bây giờ, bạn chỉ có thể có được nó thông qua SDK L xem trước và bạn cần phải thiết lập của bạn minSdkđể L. Nhưng bạn có thể sao chép tất cả các tệp cần thiết vào dự án của mình và sử dụng chúng theo cách đó cho đến khi L chính thức ra.

Bạn có thể tải về các tài liệu xem trước tại đây .

Cảnh báo: API cho Chế độ xem tái chế có thể thay đổi và có thể có lỗi.

Đã cập nhật

Mã nguồn cho listview ngang là:

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

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

Xin chào, nó có hoạt động không? bởi vì tôi đã thử và tôi không thể tạo RecyclerView theo chiều ngang. Bạn có thể đặt một số mã? cảm ơn
Cocorico

Chỉ cần đặt LinearLayoutManager- xem tại đây: stackoverflow.com/questions/28460300/ trộm
Stéphane

19

Tải tập tin jar từ đây

bây giờ đặt nó vào thư mục libs của bạn, nhấp chuột phải vào nó và chọn 'Thêm làm thư viện'

bây giờ trong tệp main.xml đặt mã này

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

bây giờ trong lớp Activity nếu bạn muốn Listview ngang với hình ảnh thì hãy đặt mã này

  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;
}

nó không hỗ trợ bất kỳ bộ chọn, hay bất kỳ bộ chọn tùy chỉnh nào? bất kỳ ý tưởng?
Nitin Misra

Tôi có thể thêm mảng số thay vì hình ảnh không?
souravlahoti

@ByingSrv có Bạn có thể
Siddhpura Amit

Sau khi đặt nó vào thư mục libs, nhấp chuột phải vào nó và nhấn 'Thêm dưới dạng thư viện'
M. Usman Khan

Làm thế nào để danh sách nhà phát triển của heftallistview như trong xung, bbcnews hãy giúp tôi
Harsha

13

Nó thực sự rất đơn giản : chỉ cần Xoay chế độ xem danh sách để nằm nghiêng

mlistView.setRotation(-90);

Sau đó, khi thổi phồng trẻ em, điều đó sẽ nằm trong phương thức getView. bạn xoay trẻ đứng thẳng:

 mylistViewchild.setRotation(90);

Biên tập: nếu ListView của bạn không khớp đúng sau khi xoay, hãy đặt ListView bên trong RotateLayout như thế này:

 <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
Tôi đã thử nó - không đơn giản như vậy. Tôi đã không quản lý để phù hợp với chế độ xem xoay theo chiều rộng và chiều cao màn hình. Và API này chỉ có sẵn trong các thiết bị mới.
Malachiasz

Trước khi xoay, hãy đặt chiều rộng listViews thành chiều cao màn hình Và đặt chiều cao của listview thành chiều rộng màn hình .. (Đó là nếu bạn muốn listview lấp đầy màn hình), hãy đặt listview thành bất kỳ chiều cao và chiều rộng nào bạn muốn trước khi xoay nó .
kc ochibili

1
bạn đã thử những gì bạn nói chưa? Tôi có và không có cái nào hoạt động.
Malachiasz

Bạn đã thử thay đổi các giá trị sau khi xoay? tôi không thấy lý do tại sao nó không hoạt động. (nếu bạn đang tự hỏi làm thế nào bạn có thể biết các giá trị chiều cao và chiều rộng trước đó sau khi xoay, bạn có thể lưu chúng vào một biến trước khi xoay và sau đó áp dụng chúng sau khi xoay.
kc ochibili

Phiên bản mới của thư viện này ( stackoverflow.com/a/16589629/2075875 ) thực hiện công việc như mong muốn và hoạt động từ Android 2.3 trong khi setRotation () có sẵn từ 3.0 vì vậy tôi không muốn chơi lại với xoay, nhưng tôi khuyến khích bạn hãy tự mình thử và trình bày mã làm việc.
Malachiasz

9

Giải pháp của tôi là chỉ cần sử dụng ViewPagerwidget. Nó không bị khóa ở giữa Galleryvà có các tính năng tích hợp để xem tái chế (như ListView). Bạn có thể thấy cách tiếp cận tương tự tại ứng dụng Google Play, bất cứ khi nào bạn xử lý các danh sách có thể cuộn theo chiều ngang.

Bạn chỉ cần mở rộng PagerAdaptervà thực hiện một vài điều chỉnh ở đó:

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;
    }
}

Do đó, bạn sẽ có tiện ích có thể cuộn theo chiều ngang với bộ điều hợp, như thế này: nhập mô tả hình ảnh ở đây


3
nó có thể cuộn như ListView, nhưng theo hướng ngang. Sự khác biệt duy nhất tôi thấy: các mục đang cuộn từng cái một, vì vậy không thể cuộn ở đâu đó đến giữa mục tiếp theo. Nhưng đó là cách ViewPager hoạt động.
Fraggjkee

8

Lưu ý: Android hiện hỗ trợ chế độ xem danh sách theo chiều ngang bằng RecyclerView, vì vậy bây giờ câu trả lời này không được chấp nhận, để biết thông tin về RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

Tôi đã phát triển logic để thực hiện mà không cần sử dụng bất kỳ thư viện cuộn ngang bên ngoài nào, đây là chế độ xem ngang mà tôi đã đạt được và tôi đã đăng câu trả lời của mình tại đây: https://stackoverflow.com/a/33301582/5479863

Phản ứng json của tôi là thế này:

{"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"}]}}

Bố cục tập tin:

    <?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>

tập tin lớp:

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;
    }

Thủ thuật đang hoạt động ở đây là id mà tôi đã gán cho ImageView "imgView.setId (v)" và sau đó áp dụng onClickListener để tôi lại tìm nạp id của chế độ xem .... Tôi cũng đã nhận xét bên trong mã thật dễ hiểu, tôi hy vọng điều này có thể rất hữu ích ... Mã hóa hạnh phúc ... :)

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


1
Tôi đã chỉnh sửa và đăng lời giải thích đầy đủ ở đây, cảm ơn vì đã gợi ý :)
Abdul Aziz

Xin chào cảm ơn mã của bạn, bạn có thể gửi phương pháp getPixelsToDP()?
Skizo-ozᴉʞS

@Skizo Tôi đã thêm phương thức đó vào cuối mã java, hãy xem
Abdul Aziz


5

Bạn có thể sử dụng RecyclerView trong thư viện hỗ trợ. RecyclerView là phiên bản ListView tổng quát hỗ trợ:

  • Một trình quản lý bố trí cho các mục định vị
  • Hoạt ảnh mặc định cho các hoạt động mục phổ biến

Trình tái chế Android Xem tài liệu


Đây là câu trả lời thực sự của ngày muộn này. Nhưng ngay cả điều này vẫn chưa sẵn sàng và vẫn còn trong 'xem trước'
Martin

3

Tôi đã thực hiện rất nhiều tìm kiếm một giải pháp cho vấn đề này. Câu trả lời ngắn gọn là, không có giải pháp tốt, mà không ghi đè các phương thức riêng tư và loại điều đó. Điều tốt nhất tôi tìm thấy là tự thực hiện nó từ đầu bằng cách mở rộng AdapterView. Thật là khổ sở. Xem câu hỏi SO của tôi về ListViews ngang .


Đáng buồn thay câu trả lời của bạn là chính xác. Ngay cả Google cũng xác nhận rằng cách duy nhất cho listview ngang là Thư viện. Nhưng Gallery không giống như một listview ngang. Bạn có sẵn sàng chia sẻ mã của bạn? Bạn có tái chế lượt xem không?
Patrick Boos

1
Thật không may, mã được viết cho công ty của tôi vì vậy là độc quyền. Tuy nhiên, tôi hy vọng sẽ tìm thấy một chút thời gian rảnh trong những tháng tới để viết lại nó (việc triển khai ban đầu khá không ổn định) và phát hành nó ra phạm vi công cộng. Tôi cũng có thể nói với bạn rằng tôi đã bắt đầu bằng cách lấy bản demo này từ Sony Ericsson, thay đổi tất cả 'x' thành 'y' và tất cả 'chiều rộng' thành 'chiều cao'. Sau đó, tôi đã loại bỏ các biến đổi 3D và thêm hành vi dừng lại ở cuối.
Neil Traft

@Neil Traft bạn đã cố định vị trí vật phẩm như thế nào? Và những gì về dừng lại ở cuối?
Adrian Magdas

Thành thật mà nói, nó thực sự chỉ là rất nhiều phỏng đoán. Phải mất một thời gian dài để làm cho đúng, và tôi tin rằng có một cách tốt hơn. Nhưng tiền đề cơ bản là, trong fillListDown()phương thức, bạn cần theo dõi cạnh dưới cùng của mục danh sách cuối cùng. Nhưng bạn không biết cạnh đó ở đâu cho đến khi bạn thực sự tạo ra mục cuối cùng (adapter.getCount () - 1). Vì vậy, bạn đợi cho đến khi mục đó được tạo và sau đó bạn có thể lưu trữ vị trí của cạnh. Khi bạn biết điều đó, bạn có thể chắc chắn rằng mListTop không bao giờ nhỏ hơn 0 và không bao giờ cao hơn chiều cao của danh sách.
Neil Traft

1
Nếu bạn không thực sự, thực sự, TUYỆT ĐỐI cần một danh sách theo chiều ngang, tôi thực sự sẽ khuyến khích bạn từ bỏ hoặc sử dụng Thư viện.
Neil Traft

3

Tôi đã phải làm điều tương tự cho một trong những dự án của mình và cuối cùng tôi cũng tự viết. Tôi gọi nó là HorzListView hiện là một phần của thư viện Aniqroid mã nguồn mở của tôi .

http://aniqroid.sileria.com/doc/api/ (Tìm kiếm các bản tải xuống ở phía dưới hoặc sử dụng dự án mã google để xem thêm các tùy chọn tải xuống: http://code.google.com.vn/p/aniqroid/doads/list )

Tài liệu lớp học ở đây: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


Làm cách nào để đặt vị trí cuộn theo chương trình?
Dima Portenko

Phương thức setSelection () có nhưng có thể không được thực hiện 100%. Thử nó.
Sileria

1

Đối với ứng dụng của tôi, tôi sử dụng một màn hình ngang có chứa linearLayout bên trong, có định hướng được đặt thành ngang. Để thêm hình ảnh bên trong, tôi tạo ImageViews bên trong hoạt động và thêm chúng vào linearLayout của tôi. Ví dụ:

<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>

Một điều này hoạt động hoàn toàn tốt cho tôi. Trong hoạt động tất cả những gì tôi phải làm là một cái gì đó giống như đoạn mã dưới đây:

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); 

Như tôi đã nói điều đó làm việc cho tôi, và tôi hy vọng nó sẽ giúp ai đó tìm kiếm để đạt được điều này là tốt.


0

tốt, bạn luôn có thể tạo các bản xem xét văn bản của mình một cách linh hoạt và thiết lập các danh sách phát hành giống như bạn làm với một bộ chuyển đổi


Ý anh là gì? tôi không thể có được bạn? xin vui lòng gửi đoạn mã về ý tưởng của bạn?
Praveen

xin vui lòng cho tôi biết mục đích của "listview ngang" nó sẽ có các khung nhìn phức tạp / đa? vd: 2 hộp văn bản 1 thanh tiến trình? hoặc chỉ nói văn bản đơn giản? Ngoài ra, bạn có một số yếu tố cố định trong chế độ xem đó hay bạn muốn thay đổi nó một cách linh hoạt? Trả lời tôi những điều này và tôi sẽ có thể giúp bạn viết mã
yếu dây

tôi muốn làm thư viện văn bản ngang. nhưng mục được chọn đến trung tâm như mặc định. Tôi muốn là mục được chọn phải là nơi tôi đã nhấp vào đó. vui lòng kiểm tra bài viết của tôi: stackoverflow.com/questions/3237566/text-gallery-on-androidstackoverflow.com/questions/3318617/ợi
Praveen

0

HorizontialListView không thể hoạt động khi dữ liệu trong bộ điều hợp có liên quan đến một luồng khác. Mọi thứ chạy 100% trên luồng UI. Đây là một vấn đề lớn trong đa luồng. Tôi nghĩ rằng sử dụng HorizontialListView không phải là giải pháp tốt nhất cho problem.HorzListView của bạn là một way.You tốt hơn chỉ cần thay thế Gallery trước đó của bạn với HorzListView.You neednot sửa đổi mã về tất cả mọi thứ adapter.Then đi cách bạn hope.See https: // stackoverflow.com/a/12339708/1525777 về HorzListView.


0

Tôi đã sử dụng liên kết listview ngang trong dự án của tôi và tôi đã nhận được kết quả tốt. Tôi đã được sử dụng thư viện devsmart ban đầu nhưng nó đã cho tôi một số vấn đề. Vì vậy, cách tốt nhất để sử dụng liên kết listview ngang vì nó đã phục hồi các vấn đề của tôi và gần đây tôi cũng đã khởi chạy ứng dụng của mình trên Google PlayStore bằng thư viện này và nhận được phản hồi tốt từ người dùng. Vì vậy, tôi khuyên bạn nên sử dụng cùng một thư viện mà tôi đã đề cập ở trên để hiển thị listview theo chiều ngang. Thưởng thức :)


0

Có một thư viện tuyệt vời cho cái đó, được gọi là TwoWayView , rất dễ thực hiện, chỉ cần đưa thư viện dự án vào không gian làm việc của bạn và thêm nó làm dự án thư viện vào dự án ban đầu của bạn, sau đó làm theo các bước sau đây được đề cập ở đây :

Trước tiên, hãy thêm một kiểu biểu thị hướng của ListView (ngang hoặc dọc) trong (res / value / Styles.xml):

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

Sau đó,

Trong XML Bố cục của bạn, sử dụng mã sau đây để thêm 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" />

và cuối cùng, chỉ cần khai báo và đối phó với nó như bất kỳ thông thường nào ListView:

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

Tất cả các phương thức ListViewsẽ hoạt động ở đây như bình thường, nhưng chỉ có một điểm khác biệt tôi nhận thấy, đó là khi cài đặt chế độ lựa chọn, phương thức setChoiceModekhông lấy một intgiá trị mà là một giá trị từ enumđược gọi ChoiceMode, vì vậy list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);sẽ có lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.


1
Tôi đã thử điều này - nhưng nó sẽ không cho phép tôi sử dụng ArrayAd CHƯƠNG <PreviewImage> của riêng mình
DeNitE Appz

-1

Bạn có thể sử dụng ViewFlipper để bao gồm XML bố cục và thêm hình ảnh, listview cho từng XML bố cục

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.