ListView,ScrollView,RecyclerView被HorizontalScrollView嵌套,加载图片

最近一直看图片加载。因为外面套着一层HorizontalScrollView,所以刚刚开始用ListView的时候,效果不是很理想,会因为要计算ListView和每个Item的高度,重复调用getView(),导致刚开始position的位置总是0,然后才开始变成0,1,2,3...

方法一:

所以我又换了一种办法,使用ScrollView。布局文件如下:

<span style="white-space:pre">	</span><ScrollView
            android:id="@+id/imgage_scroll_view"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginTop="@dimen/product_detail_margin_top"
            android:fadeScrollbars="false"
            android:focusable="false"
            android:scrollbarStyle="outsideInset"
            android:scrollbarThumbVertical="@drawable/evaluation_scroll_bar">

            <LinearLayout
                android:id="@+id/image_linear_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/detail_web_bg"
                android:focusable="false"
                android:orientation="vertical"
                android:paddingBottom="@dimen/product_detail_margin_top"></LinearLayout>
        </ScrollView>

为什么要放LinearLayout呢?因为放图片需要一个容器。

<span style="white-space:pre">	</span>for (int i = position; i < position + count; i++) {
            if (i == mImageList.size())
                break;
            String url = mImageList.get(i);
            //为LineraLayout设置一个图片地址TAG,
            // 下拉到当前界面时,可以直接加载当前页面的图片
            ImageView imageView = (ImageView) mImageLinearLayout
                    .findViewWithTag(url);
            if (!url.startsWith(Constants.HOST))
                url = Constants.HOST + url;

            ImageListener listener = ImageLoader.getImageListener(imageView, 0,
                    0);
            ImageContainer container = mImageLoader.get(url, listener,
                    Tools.converToCompatiblePx(mParentActivity, 790),
                    Tools.converToCompatiblePx(mParentActivity, 340));
            mImageContainers.add(container);
        }
这个方法可以了,但是当图片过多,过大,会报OOM的错误(Out Of Memory : 内存占有量超过VM所分配的)。

方法二:

RecyclerView,是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。不多说,代码奉上:

XML:

<android.support.v7.widget.RecyclerView  
    android:id="@+id/my_recycler_view"  
    android:scrollbars="vertical"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"/> 
Activity:

public class MyActivity extends Activity {  
    private RecyclerView mRecyclerView;  
    private RecyclerView.Adapter mAdapter;  
    private RecyclerView.LayoutManager mLayoutManager;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.my_activity);  
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);  
  
        // improve performance if you know that changes in content  
        // do not change the size of the RecyclerView  
        mRecyclerView.setHasFixedSize(true);  
  
        // use a linear layout manager  
        mLayoutManager = new LinearLayoutManager(this);  
        mRecyclerView.setLayoutManager(mLayoutManager);  
  
        // specify an adapter (see also next example)  
        mAdapter = new MyAdapter(myDataset);  
        mRecyclerView.setAdapter(mAdapter);  
    }  
    ...  
} 

Adapter:

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> {

    private Context mContext;
    private LayoutInflater mInflater;
    private List<String> mImageList;
    RequestQueue mQueue;
    public GalleryAdapter(Context context,List<String> list) {
        Log.e("GalleryAdapter",list.toString());
        this.mContext = context;
        this.mImageList = list;
        this.mInflater = LayoutInflater.from(context);

        mQueue = Volley.newRequestQueue(mContext);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);
        }
        ImageView mImageView;

    }

    @Override
    public GalleryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.productdetail_list_item,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        viewHolder.mImageView = (ImageView) view.findViewById(R.id.productdetail_list_image);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(GalleryAdapter.ViewHolder holder, int position) {
        String url = mImageList.get(position);

        Glide.with(mContext)
                .load(url)
                .placeholder(R.drawable.detail_web_bg)
                .into(holder.mImageView);
    }

    @Override
    public int getItemCount() {
        return mImageList.size();
    }
}

上面有什么不对的地方,请指出。还是实习生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值