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


215

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


1
используйте эту ссылку моего поста для создания горизонтального списка. Надеюсь, он вам поможет.
FAIZ ANWAR

2
@Индра, о которой вы упомянули, был удален
Анимеш Мангла,

Вы можете проверить этот пример thedeveloperworldisyours.com/android/...
Кабесас

Ответы:


123

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

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

  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
Понсуямбу Велладурай,

чтобы создать простое представление переработчика, используйте этот пример: android-examples.com/…
Matcoil

1
Хорошо, как для виджетов?
Владислав

В отличие от других поддерживаемых адаптером представлений, таких как ListView или GridView, RecyclerView позволяет клиентскому коду предоставлять настраиваемые компоновки для дочерних представлений. Эти механизмы контролируются RecyclerView.LayoutManager. Для работы RecyclerView должен быть предоставлен LayoutManager.
Йоханес А.И.

RecyclerView по-прежнему не может обрабатывать щелчки по элементам (не говоря уже о классе RecyclerView.Selection) так же легко и просто, как ListView - это одна из немногих причин, почему я считаю, что RecyclerView не лучший ответ на этот вопрос.
Эдвард Кихот

60

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

https://github.com/sephiroth74/HorizontalVariableListView

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


2
Это должен быть принятый ответ, потому что этот HorizontalVariableListView гораздо более продвинутый, чем у Пола. Например, у него есть подходящий метод для выбора позиции в списке, у Пола есть «TODO: реализовать когда-нибудь».
Ян Юркин

5
Обратите внимание, что это решение требует Android 2.3 или выше
user1032613

1
Горизонтальная переменная sephiroth74 - это именно то, на что вы надеетесь: копия ListView из исходного кода Android со всеми обновленными методами для перемещения по горизонтали, а не по вертикали. Я еще не столкнулся с какими-либо проблемами. Большое спасибо за то, что направили меня туда, Малахияш!
SilithCrowe

хорошо wrap_content для listview все еще не поддерживается в этой
библиотеке

1
Сейчас депортировано
Анимеш Мангла

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
Почему бы тебе не отправить это как запрос на отсылку к Полу?
Кристиан

ev.getActionMasked () недоступно на платформе Android 2.1. Ты знаешь как это побороть?
Евгений Попович

кажется, что я могу использовать int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK, которые должны быть равны ev.getMaskedAction ()
Евгений Попович

Действительно полезно! но изменив код в onTouchEvent, я получил странное смещение. Я сохранил его в dispatchTouchEvent, и он отлично работает! Спасибо
jbc25

jbc25 Я могу подтвердить, что странные скачки происходят, если использовать это исправление
Евгений Попович

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

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

В библиотеке поддержки на момент предварительного просмотра 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);

Привет, это работает? потому что я пытаюсь, и я не могу сделать горизонтальный RecyclerView. Можешь поставить код? спасибо
Cocorico

Просто установите LinearLayoutManager- см. Здесь: stackoverflow.com/questions/28460300/…
Стефан

19

Загрузите файл 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;
}

он не поддерживает какой-либо селектор или любой другой селектор? любая идея?
Нитин Мисра

Могу ли я добавить массив чисел вместо изображений?
Суравлахоти

@BeingSrv да, Вы можете
Сиддхпура Амит

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

как составить список horizonallistview, как в импульсе, bbcnews, пожалуйста, помогите мне
Харша

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 доступен только в новых устройствах.
Малахия

Перед поворотом установите ширину listViews на высоту экрана и установите высоту listviews на ширину экранов. (То есть, если вы хотите, чтобы listview заполнял экран), иначе установите listview на любую высоту и ширину, которую вы хотите, прежде чем поворачивать его. ,
kc ochibili

1
ты пытался что сказать? У меня есть и ничего из этого не работает.
Малахияз

Вы пытались изменить значения после вращения? Я не понимаю, почему это не должно работать. (если вам интересно, как вы узнали бы предыдущие значения высоты и ширины после поворота, вы можете сохранить их в переменной до поворота, а затем применить их после поворота.
kc ochibili

Новая версия этой библиотеки ( stackoverflow.com/a/16589629/2075875 ) делает работу, как следует, и работает с Android 2.3, в то время как setRotation () доступна с версии 3.0, поэтому я не хочу снова играть с вращением, но я призываю попробовать самим и представить рабочий код.
Малахия

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
Я отредактировал и разместил полное объяснение здесь, спасибо за предложение :)
Абдул Азиз

Здравствуйте, спасибо за ваш код, вы можете опубликовать метод getPixelsToDP()?
Skizo-ozᴉʞS

@Skizo Я добавил этот метод в конце кода Java, посмотрите
Абдул Азиз

6

Это не очень хороший ответ, но как насчет использования горизонтальной прокрутки ?


3
Оно работает. Но если у меня есть большое количество предметов, то я не могу использовать адаптер типа вещи и клик события.
Правин

попробуйте это indrapatel.blogspot.in/2013/10/…
Индра

5

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

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

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


Это реальный ответ на эту позднюю дату. Но даже это еще не готово и все еще в «предварительном просмотре»
Мартин

3

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


К сожалению, ваш ответ правильный. Даже Google подтверждает, что единственным способом горизонтального просмотра списка является Галерея. Но Галерея - это не то же самое, что горизонтальный просмотр списка. Хотели бы вы поделиться своим кодом? Вы перерабатываете взгляды?
Патрик Боос

1
К сожалению, код был написан для моей компании, поэтому является частным. Тем не менее, я надеюсь найти в ближайшие месяцы немного свободного времени, чтобы переписать его (оригинальная реализация довольно нестабильна) и опубликовать его в открытом доступе. Я также могу сказать, что я начал с того, что взял эту демонстрацию от Sony Ericsson, изменив все «х» на «у» и все «ширина» на «высота». Затем я удалил 3D-преобразования и добавил поведение остановки в конце.
Нил Трафт

@Neil Traft как ты исправил положение предметов? А как насчет остановки в конце?
Адриан Магдас,

Честно говоря, это было просто много догадок. Потребовалось много времени, чтобы понять это правильно, и я убежден, что есть лучший способ. Но основная предпосылка заключается в том fillListDown(), что в методе необходимо отслеживать нижний край последнего элемента списка. Но вы не знаете, где находится этот край, пока не создадите последний элемент (adapter.getCount () - 1). Таким образом, вы ждете, пока этот элемент будет создан, а затем вы можете сохранить местоположение края. Как только вы это узнаете, вы можете убедиться, что mListTop никогда не меньше 0 и никогда не больше высоты списка.
Нил Трафт

1
Если вам действительно, действительно, АБСОЛЮТНО не нужен горизонтальный список, я настоятельно рекомендую вам отказаться или использовать Галерею.
Нил Трэфт

3

Я должен был сделать то же самое для одного из моих проектов, и в итоге я написал свой собственный. Я назвал это 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


Как я могу установить положение прокрутки программно?
Дима Портенко

Метод 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

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


что вы имеете в виду? я не могу получить тебя? пожалуйста отправьте фрагмент кода о вашей идее?
Правин

пожалуйста, скажите мне цель "горизонтального просмотра списка", будет ли у него сложный / многократный просмотр? например, 2 текстовых поля 1 индикатор выполнения? или просто скажем, простой текст? Также у вас есть фиксированное количество элементов в этом представлении, или вы хотите изменить его динамически? Ответь мне на это, и я смогу помочь тебе с кодом
слабый провод

Я хочу сделать горизонтальную текстовую галерею. но выбранный элемент попадает в центр по умолчанию. Я хочу, чтобы выбранный элемент должен быть там, где я щелкнул. пожалуйста, проверьте мои сообщения: stackoverflow.com/questions/3237566/text-gallery-on-android и stackoverflow.com/questions/3318617/…
Praveen

0

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


0

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


0

Для этого есть отличная библиотека, которая называется TwoWayView , и ее очень легко реализовать, просто включите библиотеку проекта в свое рабочее пространство и добавьте ее как проект библиотеки в исходный проект, а затем выполните следующие шаги, которые изначально упоминались здесь :

Сначала добавим стиль, указывающий ориентацию ListView (горизонтальный или вертикальный) в (res / values ​​/ styles.xml):

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

Затем,

В вашем Layout 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 и добавления изображений, списка для каждого макета XML

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.