Горизонтальный ListView в Android?

Можно ли сделать ListView по горизонтали? Я сделал это в виде галереи, но выбранный элемент автоматически попадает в центр экрана. Я не хочу, чтобы выбранный элемент находился в том же месте, где я щелкнул. Как я могу исправить эту проблему? Моя идея заключалась в том, чтобы установить ListView с горизонтальной прокруткой. Поделитесь своей идеей?


person Praveen    schedule 13.07.2010    source источник
comment
используйте это ссылка на мой пост для создания Horizontal listView Я надеюсь, что это поможет вам.   -  person Faiz Anwar    schedule 21.03.2014
comment
@Indra, упомянутый вами в блоге, был удален   -  person Animesh Mangla    schedule 27.12.2015
comment
Вы можете проверить этот пример thedeveloperworldisyours.com/android/   -  person Cabezas    schedule 14.03.2016


Ответы (19)


Согласно документации Android RecyclerView - это новый способ организации элементы в списке и отображаться по горизонтали

Преимущества:

  1. Поскольку при использовании адаптера Recyclerview автоматически реализуется шаблон 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);
person Devrath    schedule 15.04.2015
comment
Это будет лучшим решением, если проблемы с LayoutManager будут устранены Google. code.google.com/p/android/issues/detail?id= 74772 - person Ponsuyambu; 15.06.2015
comment
чтобы создать простое представление ресайклера, используйте следующий пример: android-examples. ru / - person Matcoil; 17.11.2016
comment
Хорошо, а что за виджеты? - person Vladislav; 29.11.2017
comment
В отличие от других представлений с поддержкой адаптера, таких как ListView или GridView, RecyclerView позволяет клиентскому коду предоставлять настраиваемые компоновки для дочерних представлений. Эти договоренности контролируются RecyclerView.LayoutManager. Для работы RecyclerView необходимо предоставить LayoutManager. - person Yohanes AI; 06.02.2019
comment
RecyclerView по-прежнему не может обрабатывать клики по элементам (не говоря уже о классе RecyclerView.Selection) так же хорошо и просто, как ListView - это одна из немногих причин, почему я считаю, что RecyclerView не лучший ответ на этот вопрос. - person Edward Quixote; 04.11.2019

Пол не пытается исправить ошибки в своей библиотеке или принять исправления пользователей. Вот почему я предлагаю другую библиотеку с аналогичной функциональностью:

https://github.com/sephiroth74/HorizontalVariableListView

Обновление: 24 июля 2013 г. автор (sephiroth74) выпустил полностью переписанную версию, основанную на коде Android 4.2.2 ListView. Я должен сказать, что в нем нет всех ошибок, которые были в предыдущей версии, и он отлично работает!

person Malachiasz    schedule 16.05.2013
comment
Это должен быть принятый ответ, потому что HorizontalVariableListView намного более продвинутый, чем у Пола. Например, у него есть подходящий метод для выбора позиции в списке, у Пола есть TODO: реализовать когда-нибудь на этом месте. - person Yan.Yurkin; 24.09.2013
comment
Обратите внимание, что для этого решения требуется Android 2.3 или выше. - person user1032613; 23.10.2013
comment
HorizontalVariableListView sephiroth74 - это именно то, чем вы надеетесь быть: копия ListView из исходного кода Android с всеми методами, обновленными для перемещения по горизонтали, а не по вертикали. Я пока не сталкивался с какими-либо проблемами. Большое спасибо за то, что направили меня туда, Малахиас! - person SilithCrowe; 20.02.2014
comment
ну wrap_content в listview все еще не поддерживается в этой библиотеке - person Kalpesh Lakhani; 28.07.2014
comment
Кто-нибудь может понять, как использовать wrap_content для layout_height? он все портит, когда используется wrap_content - person Snake; 14.01.2015

Ответ @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;
person Xavi Gil    schedule 24.10.2011
comment
Почему бы вам не отправить это Полю как пул-реквест? - person Cristian; 14.07.2012
comment
ev.getActionMasked () недоступен на платформе Android 2.1. Вы знаете, как это преодолеть? - person Eugene Popovich; 22.11.2012
comment
кажется, что я могу использовать int maskedAction = ev.getAction () и MotionEvent.ACTION_MASK, который должен быть равен ev.getMaskedAction () - person Eugene Popovich; 22.11.2012
comment
Действительно полезно! но изменив код на onTouchEvent, я получил странное смещение. Я сохранил его в dispatchTouchEvent, и он отлично работает! Спасибо - person jbc25; 08.12.2012
comment
jbc25 я могу подтвердить, что происходят странные скачки, если использовать это исправление - person Eugene Popovich; 11.12.2012
comment
У меня есть эти скачки, и код не работает, если я использую dispatchTouchEvent. необходимо использовать onTouchEvent! О каком решении вы говорите, помогите пожалуйста. - person hasan; 09.06.2013
comment
Привет, есть новости о том, как решать прыжки? Я думаю, что сам AdapterView пытается переместить элемент в начало видимой части экрана, когда он начинает прокрутку. Как это отключить? - person ticofab; 14.08.2013
comment
Мне удалось избежать скачков: просто снова включите dispatchTouchEvent. - person ticofab; 15.08.2013
comment
@Xavi Gil У меня проблема с горизонтальным списком. Я использую библиотеку Paul, она работает нормально, но когда я быстро прокручиваю, она застревает в правой части и даже не прокручивает. Пожалуйста, посоветуйте мне, что мне делать? - person rupesh; 07.03.2014
comment
Я изменил свой код в соответствии с вами, но мой setOnTouchListener вызывает 10 раз, когда я касаюсь своего текста. Я не знаю, почему это происходит 10 раз. - person Faiz Anwar; 22.03.2014

Поскольку Google представила Android Support Library 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:

person klimat    schedule 06.11.2014

Это немного (очень) поздно, но я отправляю это на случай, если кто-то придет позже.

В библиотеке поддержки предварительной версии Android L есть RecyclerView, который делает именно то, что вы хотите.

Прямо сейчас вы можете получить его только через L preview SDK, и вам нужно установить minSdk на L. Но вы можете скопировать все необходимые файлы в свой проект и использовать их таким образом, пока L официально не выйдет.

Документы для предварительного просмотра можно загрузить здесь.

Предупреждение: API для Recycler View может измениться, и в нем могут быть ошибки.

Обновлено

Исходный код для горизонтального просмотра списка:

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

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);
person Abhay Buch    schedule 10.07.2014
comment
Привет, это работает? потому что я пытаюсь и не могу сделать горизонтальный RecyclerView. Можешь поставить код? Благодарность - person Cocorico; 22.01.2015
comment
Просто установите LinearLayoutManager - см. Здесь: stackoverflow.com/questions/28460300/ - person Stéphane; 08.04.2015

Загрузите файл jar с здесь

теперь поместите его в папку libs, щелкните его правой кнопкой мыши и выберите «Добавить как библиотеку».

теперь в main.xml поместите этот код

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

теперь в классе Activity, если вы хотите горизонтальный список с изображениями, поместите этот код

  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;
}
person Panchal Amit    schedule 21.09.2012
comment
он не поддерживает какой-либо селектор или какой-либо настраиваемый селектор? любая идея? - person Nitin Misra; 17.01.2014
comment
Могу ли я добавить массив чисел вместо изображений? - person souravlahoti; 09.05.2015
comment
@BeingSrv да, можно - person Panchal Amit; 11.05.2015
comment
Поместив его в папку libs, щелкните его правой кнопкой мыши и нажмите «Добавить как библиотеку». - person M. Usman Khan; 20.05.2015
comment
как составить список Horizontallistview как в Pulse, BBCNews, пожалуйста, помогите мне - person Harsha; 03.07.2015
comment
@Harsha, тебе нужно сделать это на заказ - person Panchal Amit; 08.10.2015
comment
элемент с настраиваемой шириной, отличной от match_width, будет отображаться только один элемент. - person zionpi; 12.04.2016

На самом деле это очень просто: просто поверните список, чтобы положить его на бок

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>
person kc ochibili    schedule 19.07.2013
comment
Я пробовал - не все так просто. Мне не удалось подогнать повернутый вид под ширину и высоту экрана. И этот API доступен только в новых устройствах. - person Malachiasz; 01.08.2013
comment
Перед поворотом установите ширину listViews равной высоте экрана и установите высоту listViews равной ширине экрана. (То есть, если вы хотите, чтобы listview заполнял экран), иначе установите для списка любую высоту и ширину, которые вы хотите, прежде чем вращать его . - person kc ochibili; 07.08.2013
comment
ты пробовал то, что говоришь? У меня есть, и ничего из этого не работает. - person Malachiasz; 07.08.2013
comment
вы пытались изменить значения после поворота? я не понимаю, почему это не должно работать. (если вам интересно, как узнать предыдущие значения высоты и ширины после поворота, вы можете сохранить их в переменной перед поворотом, а затем применить их после поворота. - person kc ochibili; 07.08.2013
comment
Новая версия этой библиотеки (stackoverflow.com/a/16589629/2075875) выполняет свою работу должным образом и работает с Android. 2.3, в то время как setRotation () доступен с версии 3.0, поэтому я не хочу снова играть с вращением, но я рекомендую вам попробовать это самостоятельно и представить рабочий код. - person Malachiasz; 08.08.2013
comment
Само вращение может быть простым, но решение далеко не однозначное. У меня тоже не работает. - person Melllvar; 19.11.2013
comment
Я использовал это, и это работает. Вы должны возиться со своими видами - шириной и высотой, если вы хотите полноэкранный режим, как говорит kc ochibili. Но работает. - person Martin; 26.09.2014
comment
Никогда не думал, что решение будет таким простым. Работал у меня. - person Rahul; 20.07.2015

Мое решение - просто использовать виджет 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;
    }
}

В результате у вас будет виджет с горизонтальной прокруткой с адаптером, например: введите описание изображения здесь

person fraggjkee    schedule 12.03.2014
comment
он прокручивается, как ListView, но в горизонтальном направлении. Единственное отличие, которое я вижу: элементы прокручиваются один за другим, поэтому невозможно прокрутить где-нибудь до середины следующего элемента. Но вот как работает ViewPager. - person fraggjkee; 16.04.2014

Примечание. 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, я снова получаю идентификатор представления .... Я также прокомментировал внутри кода, поэтому что это легко понять, надеюсь, это может быть очень полезно ... Удачного кодирования ... :)

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

person Abdul Aziz    schedule 26.10.2015
comment
Я отредактировал и разместил здесь полное объяснение, спасибо за предложение :) - person Abdul Aziz; 26.10.2015
comment
Здравствуйте, спасибо за ваш код, вы можете опубликовать метод getPixelsToDP()? - person Skizo-ozᴉʞS; 05.11.2015
comment
@Skizo Я добавил этот метод в конец java-кода, посмотрите - person Abdul Aziz; 06.11.2015


Вы можете использовать RecyclerView в библиотеке поддержки. RecyclerView - это обобщенная версия ListView, которая поддерживает:

  • Диспетчер компоновки для размещения элементов
  • Анимация по умолчанию для обычных операций с элементами

Просмотр документов Android Recycler

person mobileideafactory.com    schedule 27.06.2014
comment
Это настоящий ответ на столь поздний срок. Но даже это еще не готово и все еще находится в предварительном просмотре. - person Martin; 26.09.2014

Я много искал решение этой проблемы. Короткий ответ: нет хорошего решения без переопределения частных методов и тому подобных вещей. Лучшее, что я нашел, - это реализовать его самому с нуля, расширив AdapterView. Это довольно жалко. См. Мой вопрос SO о горизонтальных ListViews.

person Neil Traft    schedule 14.11.2010
comment
К сожалению, ваш ответ правильный. Даже Google подтверждает, что единственный способ горизонтального просмотра списка - это Галерея. Но Галерея - это не то же самое, что горизонтальный список. Вы бы хотели поделиться своим кодом? Вы перерабатываете просмотры? - person Patrick Boos; 22.02.2011
comment
К сожалению, код был написан для моей компании, поэтому он проприетарный. Тем не менее, я надеюсь найти свободное время в ближайшие месяцы, чтобы переписать его (исходная реализация довольно нестабильна) и выпустить в общественное достояние. Я также могу вам сказать, что я начал с того, что взял эта демонстрация от Sony Ericsson, в которой все 'x' заменяются на 'y' и все 'width' на 'height'. Затем я удалил 3D-преобразования и добавил поведение остановки в конце. - person Neil Traft; 22.02.2011
comment
@Neil Traft, как вы исправили положение предметов? А как насчет остановки в конце? - person Adrian Magdas; 02.03.2011
comment
Честно говоря, это действительно были лишь догадки. На то, чтобы все исправить, потребовалось много времени, и я убежден, что есть способ лучше. Но основная предпосылка заключается в том, что в методе fillListDown() вам нужно отслеживать нижний край последнего элемента списка. Но вы не знаете, где находится этот край, пока не создадите последний элемент (adapter.getCount () - 1). Итак, вы ждете, пока этот элемент будет создан, а затем можете сохранить местоположение края. Как только вы это узнаете, вы можете убедиться, что значение mListTop никогда не меньше 0 и никогда не превышает высоту списка. - person Neil Traft; 03.03.2011
comment
Если вам действительно, действительно, АБСОЛЮТНО нужен горизонтальный список, я НАСТОЯТЕЛЬНО рекомендую вам отказаться или использовать Галерею. - person Neil Traft; 03.03.2011
comment
Мне нужно избавиться от блокировки по центру галереи, что непросто, я бы сказал, невозможно без переписывания виджета с нуля. Так что я продолжу реализовывать горизонтальный список ... - person Adrian Magdas; 03.03.2011

Мне пришлось сделать то же самое для одного из моих проектов, и в итоге я написал свой собственный. Я назвал его HorzListView, теперь он является частью моей библиотеки Aniqroid с открытым исходным кодом.

http://aniqroid.sileria.com/doc/api/ (загрузите файлы на внизу или используйте проект кода Google, чтобы увидеть больше вариантов загрузки: http://code.google.com/p/aniqroid/downloads/list)

Документация по классу находится здесь: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html.

person Sileria    schedule 09.09.2012
comment
Как программно установить позицию прокрутки? - person Dima Portenko; 21.02.2013
comment
setSelection () есть, но не может быть реализован на 100%. Попробуй. - person Sileria; 29.03.2013

Для своего приложения я использую HorizontalScrollView, содержащий внутри LinearLayout, с горизонтальной ориентацией. Чтобы добавить изображения внутрь, я создаю ImageView внутри действия и добавляю их в свой 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); 

Как я уже сказал, это работает для меня, и я надеюсь, что это поможет кому-то, кто хочет этого достичь.

person Jorge Cespedes    schedule 06.03.2015

ну, вы всегда можете создавать свои текстовые просмотры и т. д. динамически и устанавливать свои onclicklisteners, как если бы вы делали с адаптером

person weakwire    schedule 14.07.2010
comment
что ты имеешь в виду? я не могу тебя достать? пожалуйста, опубликуйте отрывок кода о своей идее? - person Praveen; 24.07.2010
comment
Скажите, пожалуйста, цель горизонтального просмотра списка, будет ли он иметь сложные / множественные представления? например, 2 текстовых поля 1 индикатор выполнения? Или, скажем, простой текст? Также есть ли у вас фиксированное количество элементов внутри этого представления или вы хотите изменять его динамически? Ответьте мне на эти вопросы, и я смогу помочь вам с кодом - person weakwire; 24.07.2010
comment
я хочу сделать горизонтальную текстовую галерею. но по умолчанию выбранный элемент попадает в центр. Я хочу, чтобы выбранный элемент находился там, где я щелкнул по нему. пожалуйста, также проверьте мои сообщения: stackoverflow.com/questions/3237566/text- gallery-on-android и stackoverflow.com/questions/3318617/ - person Praveen; 24.07.2010

HorizontialListView не может работать, когда данные в адаптере задействованы в другом потоке. Все работает на 100% в потоке пользовательского интерфейса. Это большая проблема в многопоточности. Я думаю, что использование HorizontialListView - не лучшее решение вашей проблемы. HorzListView - лучший способ. Просто замените предыдущую галерею на HorzListView. Вам не нужно изменять код адаптера. Тогда все пойдет так, как вы надеетесь. См. https://stackoverflow.com/a/12339708/1525777 о HorzListView.

person Europa    schedule 19.10.2012

Я использовал горизонтальный просмотр списка ссылку в моем проекте, и я получил хорошие результаты. Сначала я использовал библиотеку devsmart, но это дало мне некоторые проблемы. Так что лучший способ использовать горизонтальная ссылка на список, так как она устранила мои проблемы, а также недавно я запустил свое приложение в Google PlayStore, используя эту библиотеку, и получил хороший отклик от пользователей. Поэтому я рекомендую вам использовать ту же библиотеку, о которой я упоминал выше, для отображения списка по горизонтали. Наслаждаться :)

person Tiger    schedule 28.04.2014

Для этого есть отличная библиотека под названием 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.

person Muhammed Refaat    schedule 04.05.2016
comment
Я пробовал это, но это не позволяет мне использовать мой собственный ArrayAdapter ‹PreviewImage› - person DeNitE Appz; 01.03.2017

Вы можете использовать ViewFlipper для включения XML макета и добавления изображений, просмотра списка для каждого XML макета

person Raju yourPepe    schedule 31.07.2013