Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
265 views
in Technique[技术] by (71.8m points)

java - Set height & gravity of Span item in GridLayoutManager

I'm working with Grid Layout Manager in Recycler View.

I can :

  • show one View Group inside Grid Layout like image below.

  • Able to set Space Item Decoration

  • Able to set different Span Size Lookup.

enter image description here

My issue is :

  • Not able to set Height of each Span row inside, as 5 small circles in above image. (I want to set smaller height)

  • The span item can not set gravity to center when it stay alone, as Big circle in above image

I tried to find method setFullSize() (exists when working with StaggerGridLayoutManager) in GridLayoutManager but looks like not useful.

People who know how to solve my issues,

Please tell me how to able do that,

Thank you,

p/s : Following coding show you :

.xml

<com.example.huy.customgridlayout.ScalingLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_item_"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>

<ImageView
    android:id="@+id/iv_"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/red_circle_256x256"
    android:scaleType="centerInside"/>

<TextView
    android:id="@+id/topic"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="90dp"
    android:textColor="@android:color/white"
    android:textSize="16sp"
    android:text="Topic"/>

<TextView
    android:id="@+id/comment_mumber"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/topic"
    android:layout_centerHorizontal="true"
    android:textSize="24sp"
    android:textColor="@android:color/white"
    android:text="594"/>

<TextView
    android:id="@+id/comment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/comment_mumber"
    android:layout_centerHorizontal="true"
    android:textSize="18sp"
    android:textColor="@android:color/white"
    android:text="Comments"/>

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/comment"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:textSize="12sp"
    android:textColor="@android:color/white"
    android:text="New! 
 2016/12/06 15:02"/>

</com.example.huy.customgridlayout.ScalingLayout>

ScalingLayout.java

public class ScalingLayout extends RelativeLayout {

private float scale = 1;

public ScalingLayout(Context context) {
    super(context);
    setWillNotDraw(false);
}

public ScalingLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public ScalingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

public void setScale(float factor){
    scale = factor;
    invalidate();
}
public float getScale(){
    return scale;
}

@Override
public void onDraw(Canvas canvas){
    canvas.scale(scale, scale);
    super.onDraw(canvas);
}

}

MainActivity.java

private GridLayoutManager mLayoutManager;
private RecyclerView mRecyclerView;

private final String[] topics = new String[]{
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Rain", // 1
        "Hot weather", // 2
        "Cold weather", // 3
        "Cool", // 4
        "Fall", // 5
        "Cool", // 4
        "Fall", // 5
};

private final int[] comment = new int[]{
        100, // 3
        200, // 4
        300, // 1
        400, // 5
        500, // 2
        600, // 6
        700, // 7
        1005, // 8
        290, // 9
        420, // 10
        20, // 11
        30, // 12
        40, // 13
        50, // 14
        60, // 15
        70, // 15
        80, // 15
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    int put = 5;

    mLayoutManager = new GridLayoutManager(this, put, GridLayoutManager.VERTICAL, false);

    mRecyclerView.setLayoutManager(mLayoutManager);

    SpacesItemDecoration decoration = new SpacesItemDecoration(-40);
    mRecyclerView.addItemDecoration(decoration);

    mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int pos) {

            // SET SPAN COLUMN IN HERE, RETURN ONE OF 5 COLUMNS I ALREADY SET IN ABOVE
            if (0 <= comment[pos] && comment[pos] < 150)
                return 1;
            else if (150 <= comment[pos] && comment[pos] < 300)
                return 2;
            else if (300 <= comment[pos] && comment[pos] < 450)
                return 3;
            else if (450 <= comment[pos] && comment[pos] < 600)
                return 4;
            else if (600 <= comment[pos])
                return 5;
            else return -1;

        }
    });

    ArrayList<Topic> mAa = new ArrayList<>();
    for (int i = 0; i < comment.length; i++) {
        mAa.add(new Topic(comment[i], topics[i]));
    }

    GridLayoutAdapter adapter = new GridLayoutAdapter(this, mAa);
    mRecyclerView.setAdapter(adapter);
}

Adapter.java

public class GridLayoutAdapter extends CustomRecyclerViewAdapter {

    private Activity activity;
    private List<Topic> topics;
//    private int screenWidth;

    public GridLayoutAdapter(Activity activity, List<Topic> images) {
        this.activity = activity;
        this.topics = images;

//        WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
//        Display display = wm.getDefaultDisplay();
//        Point size = new Point();
//        display.getSize(size);
//        screenWidth = size.x;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(activity)
                .inflate(R.layout.scaling_layout_item, parent, false);

        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        final Holder myHolder = (Holder) holder;

        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;

        BitmapFactory.decodeFile(topics.get(position).getTopic(), opts);
        opts.inJustDecodeBounds = false;

//        if (topics.get(position).getComment() < 100)
//            hideItemContent(myHolder);

        myHolder.mTvTopic.setText(topics.get(position).getTopic());
        myHolder.mTvCommentNumber.setText(String.valueOf(topics.get(position).getComment()));
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

    private void hideItemContent(Holder myHolder) {
        myHolder.mTvComment.setVisibility(View.GONE);
        myHolder.mTvCommentNumber.setVisibility(View.GONE);
        myHolder.mTvDate.setVisibility(View.GONE);
        myHolder.mTvTopic.setVisibility(View.GONE);
    }

    public class Holder extends RecyclerView.ViewHolder {

        private ScalingLayout mRl;

        private TextView mTvComment;
        private TextView mTvCommentNumber;
        private TextView mTvDate;
        private TextView mTvTopic;

        public Holder(View itemView) {
            super(itemView);

            mRl = (ScalingLayout) itemView.findViewById(R.id.rl_item_);

            mTvComment = (TextView) itemView.findViewById(R.id.comment);
            mTvCommentNumber = (TextView) itemView.findViewById(R.id.comment_mumber);
            mTvDate = (TextView) itemView.findViewById(R.id.date);
            mTvTopic = (TextView) itemView.findViewById(R.id.topic);
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...