您的位置:首页 > 移动开发 > Android开发

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

2016-03-21 20:20 615 查看
最近一直看图片加载。因为外面套着一层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();
}
}


上面有什么不对的地方,请指出。还是实习生
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息