Android GridView 的基本使用实现横向列表布局

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

希望对你有帮助

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GridView 默认是不支持横向滚动的,但可以通过一些方法来实现。 一种方法是将 GridView 包含在水平滚动的容器中,比如 HorizontalScrollView,这样就可以在横向方向上滚动 GridView 了,但是这种方法并不是很推荐,因为 HorizontalScrollView 在嵌套时可能会导致性能问题。 另一种更好的实现方法是通过自定义 GridView 的 LayoutManager 来实现横向滚动。LayoutManager 负责测量和布局子视图,并处理用户的滚动手势。可以通过继承 GridLayoutManager 并重写其中的方法来实现横向滚动。具体实现方法如下: 1. 自定义 LayoutManager ```java public class MyGridLayoutManager extends GridLayoutManager { public MyGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public MyGridLayoutManager(Context context, int spanCount) { super(context, spanCount); } public MyGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { super(context, spanCount, orientation, reverseLayout); } @Override public boolean canScrollHorizontally() { return true; // 支持横向滚动 } } ``` 2. 在布局文件中使用自定义的 LayoutManager ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layoutManager="com.example.MyGridLayoutManager" app:spanCount="3" /> ``` 这样就可以在 GridView实现横向滚动了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值