मेरे पास एक एंड्रॉइड ग्रिडव्यू है जिसमें मैं कुछ कस्टम स्क्रॉलिंग का उपयोग कर रहा हूं, इसे दो आयामों में स्क्रॉल करने के लिए - इसका मतलब है कि डिफ़ॉल्ट स्क्रॉलिंग को नहीं कहा जाता है।सभी टाइलों को खींचने के लिए फोर्स ग्रिडव्यू
मुझे संदेह है कि यह कारण हो सकता है कि ऑफ-स्क्रीन वाली पंक्तियां अदृश्य हैं। मुझे पता है कि वे वहां हैं, वे लेआउट और सबकुछ को प्रभावित करते हैं, लेकिन वे कभी आकर्षित नहीं करते हैं।
तो मेरा सवाल यह है - क्या यह लोड होने पर ग्रिडव्यू को अपने सभी टाइल्स खींचने के लिए मजबूर करने का कोई तरीका है, न केवल दृश्यमान वाले?
धन्यवाद।
संपादित करें: स्पष्ट करने के लिए - मेरी tileadapter में, मैं सेट बच्चे वास्तव में 225 मेरी GridView में करने के लिए गिनती, getChildCount() के लिए एक कॉल फिर से वापस आती है 165.
संपादित करें: यह केवल तब होता है जब की ऊंचाई ग्रिडव्यू स्क्रीन की तुलना में अधिक है - वाई अक्ष पर ऑफ-स्क्रीन वाले बच्चे आसानी से बाल गणना से घटाए जाते हैं - बच्चों के आकार को उस नंबर पर सेट करते हैं जहां वे स्क्रीन पर चुपके से फिट बैठते हैं, समस्या को हटा देते हैं, लेकिन मारता है स्क्रॉलिंग का उद्देश्य।
कोड! गतिविधि के
एक्सएमएल लेआउट:
<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;
}
एंड्रियास, कुछ मुझे बस हुआ .... अपने 'ACTION_MOVE:' को समाप्त करने के लिए 'myGridView.invalidate() 'को अपने' onTouchEvent()' (scrollBy() कथन के बाद ....) –
मैंने पहले कोशिश की है - कुछ भी नहीं होता है। कॉलिंग getChildCount के परिणामस्वरूप उसी संख्या में परिणाम (165), हालांकि कम वर्टिकल स्पेस वाले डिवाइस पर ऐप चलाने से दिखाई देने वाली पंक्तियों में उस संख्या को कम किया जाता है * 15. –
एंड्रियास, जब आपका बक्षीस खत्म हो जाता है, तो मैं एक उच्च पेशकश करूँगा बक्षीस ताकि हम इस पर और अधिक आंखें प्राप्त कर सकें। इस तरह यह बर्बाद नहीं होता है। –