Horizontal ListView in Android?

后端 未结 19 884
深忆病人
深忆病人 2020-11-22 03:54

Is it possible to make the ListView horizontally? I have done this using a gallery view, but the selected item comes to the center of the screen automatically.

相关标签:
19条回答
  • 2020-11-22 04:16

    There is a great library for that, called TwoWayView, it's very easy to implement, just include the project library into your work space and add it as a library project to your original project, and then follow the following steps which are originally mentioned here:

    First, let's add a style indicating the orientation of the ListView (horizontal or vertical) in (res/values/styles.xml):

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

    Then,

    In your Layout XML, use the following code to add the 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" />
    

    and finally, just declare it and deal with it like any regular ListView:

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

    All the methods of ListView will work here as usual, but there is only one difference I noticed, which is when setting the choice mode, the method setChoiceMode not takes an int value but a value from enum called ChoiceMode, so list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE); will be lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.

    0 讨论(0)
  • 2020-11-22 04:16

    You may use ViewFlipper to include the layout XML and add images , listview for each layout XML

    0 讨论(0)
  • 2020-11-22 04:18

    Note: Android now supports horizontal list views using RecyclerView, so now this answer is deprecated, for information about RecyclerView : https://developer.android.com/reference/android/support/v7/widget/RecyclerView

    I have developed a logic to do it without using any external horizontal scrollview library, here is the horizontal view that I achieved and I have posted my answer here:https://stackoverflow.com/a/33301582/5479863

    My json response is this:

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

    Layout file :

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

    class file:

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

    trick that is working here is the id that I have assigned to ImageView "imgView.setId(v)" and after that applying onClickListener to that I am again fetching the id of the view....I have also commented inside the code so that its easy to understand, I hope this may be very useful... Happy Coding... :)

    0 讨论(0)
  • 2020-11-22 04:18

    You can use RecyclerView in the support library. RecyclerView is a generalized version of ListView that supports:

    • A layout manager for positioning items
    • Default animations for common item operations

    Android Recycler View Docs

    0 讨论(0)
  • 2020-11-22 04:19

    As per Android Documentation RecyclerView is the new way to organize the items in listview and to be displayed horizontally

    Advantages:

    1. Since by using Recyclerview Adapter, ViewHolder pattern is automatically implemented
    2. Animation is easy to perform
    3. Many more features

    More Information about RecyclerView:

    1. grokkingandroid.com
    2. antonioleiva.com

    Sample:

    survivingwithandroid.com

    Just add the below block to make the ListView to horizontal from vertical

    Code-snippet

    LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(layoutManager);
    
    0 讨论(0)
  • 2020-11-22 04:19

    I've done a lot of searching for a solution to this problem. The short answer is, there is no good solution, without overriding private methods and that sort of thing. The best thing I found was to implement it myself from scratch by extending AdapterView. It's pretty miserable. See my SO question about horizontal ListViews.

    0 讨论(0)
提交回复
热议问题