218

ListView横向きにすることは可能ですか?ギャラリービューでこれを行ったのですが、選択したアイテムが自動的に画面の中央に来ます。選択した項目をクリックしたのと同じ場所に配置したくありません。この問題を修正するにはどうすればよいですか? 私の考えはListView、水平スクロールで設定することでした。あなたのアイデアを共有しますか?

4

19 に答える 19

124

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);
于 2015-04-15T11:13:43.000 に答える
60

Paul は、自分のライブラリのバグを修正したり、ユーザーの修正を受け入れたりすることを気にしません。そのため、同様の機能を持つ別のライブラリを提案しています。

https://github.com/sephiroth74/Horizo​​ntalVariableListView

更新: 2013 年 7 月 24 日、作成者 (sephiroth74) は、android 4.2.2 ListView のコードに基づいて完全に書き直されたバージョンをリリースしました。以前のバージョンにあったすべてのエラーがなく、うまく機能していると言わざるを得ません!

于 2013-05-16T14:05:10.177 に答える
28

@Paul の回答は優れたソリューションへのリンクですが、コードではアイテムの子でonClickListenersを使用できません(コールバック関数は呼び出されません)。私は解決策を見つけるのにしばらく苦労しており、そのコードで変更する必要があるものをここに投稿することにしました (誰かがそれを必要とする場合に備えて)。

dispatchTouchEventoverrideをオーバーライドする代わりにonTouchEvent。同じコードを使用しdispatchTouchEventてメソッドを削除します (ここで 2 つの違いを読むことができます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;
于 2011-10-24T21:13:04.443 に答える
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;
}
于 2012-09-21T17:54:13.557 に答える
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)" に割り当てた ID です。その後、onClickListener を適用して、ビューの ID を再度取得しています....コード内にもコメントしましたので、理解しやすいので、これが非常に役立つことを願っています...ハッピーコーディング... :)

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

于 2015-10-26T06:07:53.780 に答える
6

これはあまり答えではありませんが、Horizo​​ntal Scroll Viewを使用するのはどうですか?

于 2010-07-13T18:56:29.617 に答える
5

サポート ライブラリで RecyclerView を使用できます。RecyclerView は、次をサポートする ListView の一般化されたバージョンです。

  • アイテムを配置するためのレイアウト マネージャー
  • 一般的なアイテム操作のデフォルト アニメーション

Android リサイクラー ドキュメントを見る

于 2014-06-27T17:42:15.950 に答える
3

私はこの問題の解決策をたくさん探しました。簡単に言えば、プライベート メソッドなどをオーバーライドしない限り、良い解決策はないということです。私が見つけた最良の方法は、拡張してゼロから自分で実装することでしたAdapterView。かなり惨めです。水平 ListViews に関する私の SO の質問を参照してください。

于 2010-11-14T01:01:33.273 に答える
3

私は自分のプロジェクトの 1 つで同じことをしなければならず、自分自身のプロジェクトも書くことになりました。私はこれを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

于 2012-09-09T13:59:00.433 に答える
1

私のアプリケーションでは、内部に LinearLayout を含む Horizo​​ntalScrollView を使用します。これは、方向が水平に設定されています。内部に画像を追加するために、アクティビティ内に 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); 

私が言ったように、それは私にとってはうまくいくので、これを達成しようとしている人にも役立つことを願っています.

于 2015-03-06T18:13:01.903 に答える
0

いつでもテキストビューなどを動的に作成し、アダプターで行うように onclicklisteners を設定できます

于 2010-07-14T13:35:09.483 に答える
0

アダプター内のデータが別のスレッドに関係している場合、Horizo​​ntialListView は機能しません。すべてが UI スレッドで 100% 実行されます。これはマルチスレッドでは大きな問題です。Horizo ​​ntialListView を使用することは、問題に対する最善の解決策ではないと思います。 HorzListView については、 stackoverflow.com /a/12339708/1525777 を参照してください。

于 2012-10-19T07:54:44.890 に答える
-1

ViewFlipper を使用して、レイアウト XML を含め、各レイアウト XML の画像、リストビューを追加できます。

于 2013-07-31T04:36:59.400 に答える