У меня есть андроид gridview, в котором я использую какую-то пользовательскую прокрутку, чтобы прокручивать ее в двух измерениях - это означает, что прокрутка по умолчанию не вызывается.Force gridview, чтобы нарисовать все плитки
Я подозреваю, что это может быть причиной того, что строки, которые находятся за пределами экрана, невидимы. Я знаю, что они там, они влияют на макет и все, но они никогда не рисуют.
Таким образом, мой вопрос заключается в том, есть ли способ заставить gridview рисовать все свои плитки, когда он загружен, а не только видимые?
Спасибо.
Edit: Для того, чтобы уточнить - В моем tileadapter, я устанавливаю рассчитывать ребенок точно 225. В моей GridView, вызов GetChildCount() возвращает 165.
Редактировать снова: Это происходит только тогда, когда высота из gridview больше, чем у экрана - дети, которые находятся вне экрана на оси y, просто вычитаются из дочернего счета - установка размера детей на число, где они все плотно прилегают к экрану, устраняет проблему, но убивает цель прокрутки.
Код!
XML Схема деятельности:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:theme="@style/Theme.Custom"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/logmessage"
android:theme="@style/Theme.Custom"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:text="LogMessage"/>
<RelativeLayout android:id="@+id/boardwrap"
android:layout_weight="1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:gravity="center_vertical">
<com.MyProject.GameGrid
android:id="@+id/board"
android:theme="@style/Theme.Custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="15"
android:stretchMode="none"
android:verticalSpacing="0dip"
android:horizontalSpacing="0dip"
android:padding="0dip"
android:columnWidth="20dip"
android:scrollbars="none"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/toolbar"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:background="#FFFFFFFF"/>
</LinearLayout>
активность:
public class GameBoardActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gameboard);
GameGrid Board = (GameGrid)findViewById(R.id.board);
Board.setAdapter(new TileAdapter(this));
}
}
GameGrid:
public GameGrid(Context context, AttributeSet attrs) {
super(context, attrs);
this.setNumColumns(15);
DisplayMetrics metrics = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
scale = metrics.density;
smallSize = Math.round(20 * scale);
largeSize = Math.round(40 * scale);
columnwidth = largeSize;
this.setColumnWidth(columnwidth);
Common.DebugMessage(Float.toString(columnwidth));
}
Вы можете заметить, я определяю маленький и большой размер здесь - двойной нажатие на экран позволяет переключаться между ними.
скроллинг (то, что вы помогли мне с ранее)
if (myState == TOUCH_STATE_SCROLLING) {
final int deltaX = (int) (mLastX - x);
final int deltaY = (int) (mLastY - y);
mLastX = x;
mLastY = y;
int xpos = this.getScrollX();
int ypos = this.getScrollY();
int maxX = (columnwidth * 15) - super.getWidth();
int maxY = (columnwidth * 15) - super.getHeight();
if (xpos + deltaX >= 0 && xpos + deltaX <= maxX && ypos + deltaY >= 0 && ypos + deltaY <= maxY)
{
this.scrollBy(deltaX, deltaY);
}
else {
this.scrollTo(xpos + deltaX <= 0 ? 0 : xpos + deltaX >= maxX ? maxX : xpos + deltaX,
ypos + deltaY <= 0 ? 0 : ypos + deltaY >= maxY ? maxY : ypos + deltaY);
}
Common.DebugMessage(this.getChildCount());
}
Common.DebugMessage просто вспомогательный метод для печати отладочных сообщений LogCat
TileAdapter:
public TileAdapter(Context c) {
mContext = c;
}
@Override
public int getCount() {
return 225;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
int colWidth = ((GameGrid)parent).getColumnWidth();
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(colWidth , colWidth));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(0, 0, 0, 0);
}
else {
imageView = (ImageView)convertView;
}
imageView.setImageResource(R.drawable.tile);
return imageView;
}
Andreas, что-то JUST произошло у меня .... Попробуйте добавить 'myGridView.invalidate()' до конца свой 'ACTION_MOVE:' в свой 'onTouchEvent()' (после инструкции scrollBy() ....) –
Я пробовал это раньше - ничего не происходит. Вызов getChildCount после этого приводит к тому же номеру (165), хотя запуск приложения на устройстве с меньшим вертикальным пространством уменьшает это число до видимых строк * 15. –
Андреас, когда ваша награда закончится, я буду предлагать более высокий щедрость, чтобы мы могли больше смотреть на это. Таким образом, это не пропадает даром. –