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


215

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


1
скористайтеся цим посиланням моєї публікації для створення горизонтального спискуПеревіритись, я сподіваюся, що він вам допоможе.
FAIZ ANWAR

2
@Indra, що згадуваний вами блог, видалено
Animesh Mangla

Ви можете перевірити цей приклад thedeveloperworldisyours.com/android/…
Cabezas

Відповіді:


123

Відповідно до Документації на Android RecyclerView- це новий спосіб впорядкування елементів у перегляді списку та їх відображення в горизонтальному положенні

Переваги:

  1. Оскільки за допомогою адаптера Recyclerview, схема ViewHolder автоматично реалізується
  2. Анімація проста у виконанні
  3. Багато інших функцій

Більше інформації про RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

Зразок:

survivalwithandroid.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/isissue/detail?id=74772
Ponsuyambu Velladurai

щоб створити простий вид переробника, використовуйте цей приклад: android-examples.com/…
Matcoil

1
Гаразд, який спосіб для віджетів?
Владислав

На відміну від інших представлених адаптером типів, таких як ListView або GridView, RecyclerView дозволяє клієнтському коду надавати власні компонування для дочірніх представлень. Ці домовленості контролюються RecyclerView.LayoutManager. Для функціонування RecyclerView повинен бути передбачений LayoutManager.
Йохан AI

RecyclerView досі не може обробляти кліки по елементах (не згадуйте RecyclerView.Selection class) так само добре і просто, як ListView - це одна з небагатьох причин, чому я вважаю, що RecyclerView не є найкращою відповіддю на це питання.
Едвард Кіхот

60

Пол не намагається виправляти помилки своєї бібліотеки чи приймати виправлення користувачів. Ось чому я пропоную іншу бібліотеку, яка має аналогічні функції:

https://github.com/sephiroth74/HorizontalVariableListView

Оновлення : 24 липня 2013 року автор (sephiroth74) випустив повністю перероблену версію на основі коду Android 4.2.2 ListView. Треба сказати, що він не має всіх помилок, які мала попередня версія, і працює чудово!


2
Це має бути прийнятою відповіддю, тому що цей HorizontalVariableListView набагато досконаліший, ніж Павловий. Наприклад, у нього є відповідний метод вибору позиції у списку, у Павла - "TODO: впровадити коли-небудь" на своєму місці.
Ян.Юркін

5
Зауважте, що для цього рішення потрібен android 2.3 або новішої
версії

1
HorizontalVariableListView sephiroth74 - саме те, на що ви сподіваєтесь: Копія ListView з вихідного коду для Android із усіма оновленими методами для переміщення по горизонталі, а не по вертикалі. Я ще не стикався з жодними проблемами. Дуже дякую, що направили мене туди, Малахіаш!
SilithCrowe

добре wrap_content to listview все ще не підтримується в цій
лібi

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
Чому ти не надішлеш це Паулу як запит на тягу?
Крістіан

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 предпросмотра SDK і вам необхідно встановити minSdkTo L. Але ви можете скопіювати всі необхідні файли у свій проект і використовувати їх таким чином, поки L офіційно не вийде.

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

Попередження: API для перегляду Recycler може змінюватися і в ньому можуть бути помилки.

Оновлено

Вихідний код для горизонтального перегляду списку:

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

тепер у класі активності, якщо ви хочете Горизонтальний перегляд списків із зображеннями, тоді поставте цей код

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

він не підтримує жодного селектора чи будь-якого спеціального селектора? будь-яка ідея?
Нітін Місра

Чи можна додати масив чисел замість зображень?
souravlahoti

@BeingSrv так можна
Siddhpura Amit

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

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

Перед обертанням встановіть ширину 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, яка підтримує:

  • Менеджер макетів для позиціонування елементів
  • Анімації за замовчуванням для звичайних операцій з елементами

Переглянути документи Google Recycler


Це справжня відповідь на цю пізню дату. Але навіть це ще не готове і досі перебуває у «попередньому перегляді»
Мартін,

3

Я багато шукав рішення цієї проблеми. Коротка відповідь полягає в тому, що не існує хорошого рішення, не перекриваючи приватні методи та подібні речі. Найкраще, що я знайшов - це реалізувати його з нуля шляхом його розширення AdapterView. Це досить жалюгідно. Дивіться моє запитання щодо горизонтальних списків ViewView .


На жаль, ваша відповідь правильна. Навіть Google підтверджує, що єдиний спосіб горизонтального перегляду списку - це Галерея. Але Галерея не є такою ж, як горизонтальний перегляд списку. Чи бажаєте ви поділитися своїм кодом? Ви переробляєте перегляди?
Патрік Боос

1
На жаль, код був написаний для моєї компанії, тому він є власником. Однак, я сподіваюся, що знайду вільний час у найближчі місяці, щоб переписати його (оригінальна реалізація є досить нестабільним) та випустити його у загальнодоступне надбання. Я також можу вам сказати, що я почав із того, як взяти цю демонстрацію від Sony Ericsson, змінивши всі "x" на "y" і всі "ширина" на "висота". Потім я видалив 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

добре, ви завжди зможете динамічно створювати свої текстові перегляди тощо та встановлювати свої онкліклісти, як це було б із адаптером


Що ви маєте на увазі? я не можу тебе отримати? будь ласка, опублікуйте фрагмент коду про вашу ідею?
Правен

скажіть, будь ласка, мета "горизонтального перегляду списку", чи буде він мати складні / багатоповерхові перегляди? наприклад, 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

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


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.