android - recyclerview简书 - recyclerview横向瀑布流




Android中的水平ListView? (13)

@Paul答案链接到一个很好的解决方案,但是代码不允许在items子项上使用onClickListeners (回调函数从未被调用)。 我一直在努力寻找一个解决方案,我决定在这里发布你需要修改的代码(以防有人需要它)。

而不是覆盖onTouchEvent dispatchTouchEvent覆盖。 使用与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;

是否有可能使ListView水平? 我已完成此操作使用图库视图,但所选项自动进入屏幕中心。 我不想在我点击的同一地点选择的项目。 我该如何解决这个问题? 我的想法是用水平滚动设置ListView 。 分享你的想法?


其实很简单 :只需旋转列表视图以放置其侧面

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>

保罗不打扰他的图书馆的错误或接受用户修复。 这就是为什么我建议另一个具有类似功能的库:

https://github.com/sephiroth74/HorizontalVariableListView

更新 :2013年7月24日作者(sephiroth74)基于android 4.2.2 ListView的代码发布了完全重写的版本。 我必须说,它没有所有的错误,以前的版本和伟大的工程!


对于我的应用程序,我使用了一个包含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); 

正如我所说的那样对我有用,我希望它能帮助那些希望实现这一目标的人。


您可以使用ViewFlipper来包含布局XML并为每个布局XML添加图像和列表视图


您可以在支持库中使用RecyclerView。 RecyclerView是ListView的一个广义版本,它支持:

  • 定位项目的布局管理器
  • 常用项目操作的默认动画

Android Recycler查看文档


我已经做了很多搜索这个问题的解决方案。 简而言之,没有好的解决方案,没有重写私有方法等等。 我发现的最好的事情是通过扩展AdapterView从头开始实现它。 这是非常悲惨的。 看到我关于水平ListViews的SO问题


我开发了一个逻辑来做到这一点,而不使用任何外部水平滚动视图库,这里是我实现的水平视图,并且我在这里发布了我的答案: https://.com/a/33301582/5479863 ://.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的id“imgView.setId(v)”,然后再应用onClickListener,我再次获取视图的id ....我也在代码中注释过它很容易理解,我希望这可能是非常有用的...快乐编码... :)


我的解决方案是简单地使用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;
    }
}

因此,您将使用适配器水平滚动窗口小部件,如下所示:


按照Android文档RecyclerView是在listview中组织项目并水平显示的新方法

优点:

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


这有点(非常)晚了,但我发布这个以防某些人稍后再来。

作为Android L预览的支持库有一个RecyclerView ,它完全符合你的需求。

现在,您只能通过L预览SDK获取它,并且需要将minSdk设置为L 但是,您可以将所有必要的文件复制到您的项目中,并以这种方式使用它们,直到L正式退出。

您可以在here下载预览文档。

警告:回收站视图的API可能会更改,并且可能存在错误。

更新

水平listview的源代码是:

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

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

那么你总是可以动态地创建你的textviews等,并设置你的onclicklisteners,就像你用一个适配器做的一样





horizontal-scrolling