在Android布局中,ListView经常被用来做适配器
然而 ListView 只能竖向排列,如果有要求到横向排列该怎么办呢?
可以使用 GridView 控件
首先写一个方法类 继承自 HorizontalScrollView
import android.content.Context;
import android.util.AttributeSet;
import android.widget.HorizontalScrollView;
public class IndexListHorizontalScrollView extends HorizontalScrollView {
private ScrollViewListener scrollViewListener = null;
public IndexListHorizontalScrollView(Context context) {
super(context);
}
public IndexListHorizontalScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public IndexListHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this,x, y, oldx, oldy);
}
}
public interface ScrollViewListener {
void onScrollChanged(IndexListHorizontalScrollView scrollView, int x, int y, int oldx, int oldy);
}
}
在要使用的activity 的布局页面中写入:
<com.nomge.android.lsiView.IndexListHorizontalScrollView
android:id="@+id/index_list_ho"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:scrollbars="none">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<GridView
android:id="@+id/user_gridView"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="auto_fit"
android:stretchMode="spacingWidthUniform"></GridView>
</LinearLayout>
</com.nomge.android.lsiView.IndexListHorizontalScrollView>
然后在要使用的activity 中写入:
我这个活动的名称是 GroupOrderConfirm
private GridView gridView;
private List<GroupVos> groupVos;
private void initData(){
groupVos = new ArrayList<GroupVos>();
gridView = findViewById(R.id.user_gridView);
}
private void getOrderGoodsList(int userCouponId,int addressId){
OkHttpClient client = new OkHttpClient();
String orderUrl = url+"/api/v2/order/multiShopOrderPreview?TokenID="+TokenID+"&userCouponId="+userCouponId+"&addressId="+addressId+"&isCheckedGold="+0;
Request request = new Request.Builder().get().url(orderUrl).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
try {
JSONObject jsonObject = new JSONObject(json);
String status = jsonObject.getString("status");
JSONObject data = jsonObject.getJSONObject("data");
orderPreview = JSON.parseObject(data.toString(), OrderPreview.class);
runOnUiThread(new Runnable() {
@Override
public void run() {
groupVos = orderPreview.getGroupVos();//GroupVos后台数据类型是数组array
setGridView();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void setGridView() {
int size = groupVos.size();
/*获取dp值*/
float pxValue2 = getResources().getDimension(R.dimen.dp_50);//获取对应资源文件下的dp值
int dpValue = ConvertUtils.px2dp(getApplication(), pxValue2);//将px值转换成dp值
int width = dpValue;
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕分辨率
float density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
int gridviewWidth = (int) (size * (width + 4) * density);
int itemWidth = (int) (width * density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
gridviewWidth, LinearLayout.LayoutParams.WRAP_CONTENT);
gridView.setLayoutParams(params); // 设置GirdView布局参数,横向布局的关键
gridView.setColumnWidth(itemWidth); // 设置列表项宽
gridView.setHorizontalSpacing(5); // 设置列表项水平间距*/
gridView.setStretchMode(GridView.NO_STRETCH);
gridView.setNumColumns(size); // 设置列数量=列表集合数
//适配器导入页面
final GroupOrderConfirm.GridViewAdapter1 adapter = new GroupOrderConfirm.GridViewAdapter1(getApplicationContext(),
groupVos);
gridView.setAdapter(adapter);
gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
}
public class GridViewAdapter1 extends BaseAdapter {
Context context;
List<GroupVos> list;
private int location;
private int location1;
public GridViewAdapter1(Context _context, List<GroupVos> _list) {
this.list = _list;
this.context = _context;
}
public void setSeclection(int position) {
location = position;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.group_order_groupvos, null);
TextView tv_zhifu_status = (TextView) convertView.findViewById(R.id.tv_zhifu_status);
ImageView circleHeadImageView2 = (ImageView) convertView.findViewById(R.id.circleHeadImageView2);
GroupVos index = list.get(position);
GlideImageLoader glideImageLoader = new GlideImageLoader();
glideImageLoader.displayImage(getApplication(), index.getuHeadimgurl(), circleHeadImageView2);
if (index.getStatus() == 0){
tv_zhifu_status.setText("待支付");
}else{
tv_zhifu_status.setText("已支付");
}
return convertView;
}
}
1、GroupVos 是一个集合类,用来获取从后台拿到的数据,这里GroupVos 在后台的数据类型是数组。
2、在setGridView()方法中,适配器导入页面:
final GroupOrderConfirm.GridViewAdapter1 adapter = new GroupOrderConfirm.GridViewAdapter1(getApplicationContext(),groupVos);
记得换成你自己的。
3、GridViewAdapter1()方法中:
TextView tv_zhifu_status = (TextView) convertView.findViewById(R.id.tv_zhifu_status);
ImageView circleHeadImageView2 = (ImageView) convertView.findViewById(R.id.circleHeadImageView2);
这两个方法也是根据你自己布局来。
最后成图:
扩展
如果你这个布局样式是经常被引用到的话 可以将 上方的GridViewAdapter1()单独写一个类
然后在setGridView()方法,适配器导入页面那里直接引用即可
例如:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nomge.android.R;
import com.nomge.android.pojo.GoodsList;
import java.util.List;
/**GirdView 数据适配器*/
public class UserGridViewAdapter extends BaseAdapter {
Context context;
List<GoodsList> list;
private int location;
private int location1;
public UserGridViewAdapter(Context _context, List<GoodsList> _list) {
this.list = _list;
this.context = _context;
}
public void setSeclection(int position) {
location = position;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.weini_tui, null);
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txtIcon = (TextView) convertView.findViewById(R.id.txt_icon);
TextView priceYuan = (TextView) convertView.findViewById(R.id.price_yuan);
TextView zhuangPrice = (TextView) convertView.findViewById(R.id.zhuang_price);
TextView priceRe = (TextView) convertView.findViewById(R.id.price_re);
TextView txt_guige = (TextView) convertView.findViewById(R.id.txt_guige);
GoodsList index = list.get(position);
GlideImageLoader glideImageLoader= new GlideImageLoader();
glideImageLoader.displayImage(context,index.getPrimaryPicUrl(),imgIcon);
txtIcon.setText(index.getName());
txt_guige.setText(index.getGoodsBrief());
if(index.getPriceIsVisible() == 0){
priceYuan.setText("***");
zhuangPrice.setText("/仅会员可见");
}
else{
priceYuan.setText(index.getMarketPrice());
zhuangPrice.setText("/赚¥" + index.getBrokerage());
}
return convertView;
}
}
然后在你想使用这个布局的activity照常使用setGridView()
只是适配器导入那里可以直接写:
//为你推荐适配器导入页面
final UserGridViewAdapter adapter = new UserGridViewAdapter(getApplicationContext(),
goodsLists);
gridView.setAdapter(adapter);
希望对你有帮助