private void addNewItems() { currentChildCount = getChildCount(); parentLayout = false; int start = itemIds.size(); int end = Math.min(start + screenMaxColumns * rows * 2, adapter.getCount()); for (int i = start; i < end; i++) { int left = (i / rows) * (itemWidth + spaceHori); int top = (i % rows) * (spaceVert + itemHeight); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(itemWidth, itemHeight); rlp.setMargins(left, top, 0, 0); View child = adapter.getView(i, null, this); this.addView(child, rlp); int viewId = child.getId(); if (viewId == -1) { viewId = TvUtil.buildId(); // 此处硬设置id同时建议开发者不用此范围id } child.setId(viewId); itemIds.put(viewId, i); bindEventOnChild(child, i); layoutFlag = true; } colCount = itemIds.size() % rows == 0 ? itemIds.size() / rows : itemIds.size() / rows + 1; }
private void initItems() { // 避免冲突 if (getChildCount() > 0) { return; } int screenWidth = wm.getDefaultDisplay().getWidth(); int initCols = screenWidth % rowWidth == 0 ? screenWidth / rowWidth : screenWidth / rowWidth + 1; int initLength = Math.min(adapter.getCount(), initCols * 2 * rows); for (int i = 0; i < initLength; i++) { int left = (i / rows) * (itemWidth + spaceHori); int top = (i % rows) * (spaceVert + itemHeight); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(itemWidth, itemHeight); if (initLength == 1) { rlp.setMargins(left, top, 0, paddingTop * 2); } else { rlp.setMargins(left, top, 0, 0); } View child = adapter.getView(i, null, this); this.addView(child, rlp); int viewId = child.getId(); if (viewId == -1) { viewId = TvUtil.buildId(); // 此处硬设置id同时建议开发者不用此范围id } child.setId(viewId); itemIds.put(viewId, i); bindEventOnChild(child, i); layoutFlag = true; } colCount = itemIds.size() % rows == 0 ? itemIds.size() / rows : itemIds.size() / rows + 1; cursor = new ImageView(getContext()); cursorId = TvUtil.buildId(); cursor.setId(cursorId); cursor.setBackgroundResource(cursorRes); this.addView(cursor); cursor.setVisibility(View.INVISIBLE); if (initFocus) { View focus = ((ViewGroup) getParent()).findFocus(); if (focus == null) { View item = getChildAt(0); if (item != null) { item.requestFocus(); } } } }
/** * 设置适配器 * * @param adapter */ public void setAdapter(TvBaseAdapter adapter) { this.adapter = adapter; if (adapter != null) { adapter.registerDataSetObservable(mDataSetObservable); } // 清理原先数据 clear(); if (isInit) { initGridView(); isInit = false; } Message msg = handler.obtainMessage(); msg.what = ACTION_INIT_ITEMS; handler.sendMessageDelayed(msg, DELAY); }