How to set different columns for rows in android gridview

后端 未结 10 792
旧时难觅i
旧时难觅i 2020-12-01 07:17

I want to have a gridview similar to this

\"enter

Every odd numbered row will

相关标签:
10条回答
  • 2020-12-01 07:57

    Instead of considering a single image views i am taking group of three images as a single grid item,

    enter image description here

    try this inside your grid adapter

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/green"
        android:orientation="vertical">
    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitXY"
        android:src="@drawable/user"
         />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:id="@+id/image_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:scaleType="fitXY"
                android:src="@drawable/user"
    
                />
            <ImageView
                android:id="@+id/image_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:src="@drawable/user"
                android:scaleType="fitXY"
                android:layout_weight="1"
                />
    
            </LinearLayout>
    
        </LinearLayout>
    

    and your grid view would be like

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/RelativeLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="2"
        >
    
    </GridView>
    

    The only thing you have to take care of is, the sequence of your image. might be this will help you

    0 讨论(0)
  • 2020-12-01 08:02

    Use Expandable list view and provide different view for each row.

    http://developer.android.com/reference/android/widget/ExpandableListView.html

    0 讨论(0)
  • 2020-12-01 08:03

    Did you try a RecyclerView in a combination with a StaggeredGridLayoutManager?

    This combination results in something like this: video.

    I think, this is what you are looking for.

    0 讨论(0)
  • 2020-12-01 08:06

    There is how does it work in my project I have different height of cells and also header

    adapter:

    public class AdapterRecViewMain
        extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    private List<BaseMarkerElement> mainCardList;
    private final int HEADER_VIEW = 0;
    private final int FOOTER_VIEW = 1;
    
    public AdapterRecViewMain() {
    }
    
    public void setData(List<BaseMarkerElement> mainCardList) {
        this.mainCardList = mainCardList;
    }
    
    @Override public int getItemViewType(int position) {
        if (position == 0) {
            return HEADER_VIEW;
        }
        return FOOTER_VIEW;
    }
    
    @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        if (type == FOOTER_VIEW) {
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.card_main_activity, viewGroup, false);
            return new MainCardViewHolder(v);
        } else {
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.header_view_main_activity, viewGroup, false);
            return new HeaderViewHolder(v);
        }
    }
    
    @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int positionItem) {
        final int position = viewHolder.getAdapterPosition();
    
        if (viewHolder instanceof HeaderViewHolder) {
            StaggeredGridLayoutManager.LayoutParams layoutParams =
                    (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
            layoutParams.setFullSpan(true);
    
            BaseMarkerElement item = mainCardList.get(position);
            if (item instanceof HeaderView) {
                HeaderView header = (HeaderView) mainCardList.get(position);
                // need to add implementation
            }
        } else if (viewHolder instanceof MainCardViewHolder) {
            MainCardViewHolder currentView = (MainCardViewHolder) viewHolder;
            CardMainActivity currentCard = (CardMainActivity) mainCardList.get(position);
    
            currentView.ivMainCard.setImageResource(currentCard.getIvMainCard());
            currentView.tvBrandName.setText(currentCard.getTvBrandName());
            currentView.tvPrice.setText(currentCard.getTvPrice());
            currentView.tvType.setText(currentCard.getTvType());
        }
    }
    
    @Override public int getItemCount() {
        return mainCardList.size();
    }
    
    private class MainCardViewHolder extends RecyclerView.ViewHolder {
        ImageView ivMainCard;
        TextView tvBrandName;
        TextView tvType;
        TextView tvPrice;
    
        MainCardViewHolder(View view) {
            super(view);
            ivMainCard = (ImageView) view.findViewById(R.id.imageViewMainCard);
            tvBrandName = (TextView) view.findViewById(R.id.tvBrandName);
            tvType = (TextView) view.findViewById(R.id.tvType);
            tvPrice = (TextView) view.findViewById(R.id.tvPrice);
        }
    }
    
    private class HeaderViewHolder extends RecyclerView.ViewHolder {
    
        public HeaderViewHolder(View itemView) {
            super(itemView);
    
        }
    }
    }
    

    In your activity :

    private AdapterRecViewMain adapter;
    private RecyclerView rvMain;
    
    @Override protected void onResume() {
        super.onResume();
        Logger.logGeneral("onResume()");
    
        if (adapter == null) {
            setUpRecView();
        }
    }
    
    private void setUpRecView() {
        adapter = new AdapterRecViewMain();
        adapter.setData(controller.loadData());
        rvMain = (RecyclerView) findViewById(R.id.rvMain);
        final StaggeredGridLayoutManager layoutManager =
                new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        rvMain.setLayoutManager(layoutManager);
    
        rvMain.addOnScrollListener(scrollListener);
        rvMain.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        rvMain.invalidate();
    }
    
    0 讨论(0)
  • 2020-12-01 08:07

    Try this ,

    https://github.com/etsy/AndroidStaggeredGrid

    Staggered-Grid View ,

    Extremely simple , easy to use.

    0 讨论(0)
  • 2020-12-01 08:13

    You should set in RecyclerView :

    recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    
    0 讨论(0)
提交回复
热议问题