2010-06-21 19 views
12

के भीतर टेबललेआउट की अंतिम पंक्ति तक स्क्रॉल करें, मैं स्क्रॉलव्यू के अंदर एक टेबललेआउट का उपयोग करके उपयोगकर्ता इंटरैक्शन के परिणामस्वरूप समय के साथ पंक्तियों के साथ एक गतिशील तालिका रखना चाहता हूं। यह ठीक काम करता है, लेकिन जब मैं का उपयोग कर तालिका के अंत तक स्क्रॉल करना चाहता हूं, तो यह हमेशा अंतिम पंक्ति को छोड़ देता है; यानी, यह स्क्रॉल करता है ताकि अंतिम व्यक्ति से पहले एक दिखाई दे। मैन्युअल रूप से स्क्रॉल करते समय अंतिम पंक्ति दिखाई देती है, और स्क्रॉलबार भी सही है।स्क्रॉलव्यू

मैं निश्चित रूप से सुझावों के लिए खुला हूं कि इस से बेहतर लेआउट कैसे बनाया जाए; लेकिन मुझे विशेष रूप से समझने में दिलचस्पी है कि fullScroll() इस तरह से व्यवहार क्यों करता है। क्या मुझे इसे एक अलग पैरामीटर देना चाहिए, या पूरी तरह से कुछ और उपयोग करना चाहिए? या ऐसा करता है क्योंकि नई गयी लाइन अभी तक किसी भी तरह दिखाई नहीं दे रही है? (यदि हां, तो मैं इसे कैसे हल कर सकता हूं?) या क्या मुझे कुछ और स्पष्ट बात याद आई?

TestActivity.java:

package com.example.android.tests; 

import java.util.Random; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ScrollView; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 

public class TestActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ((Button) findViewById(R.id.AddRow)).setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Random rnd = new Random(); 
       TableRow nr = new TableRow(v.getContext()); 
       for (int c=0; c<3; c++) { 
        TextView nv = new TextView(v.getContext()); 
        nv.setText(Integer.toString(rnd.nextInt(20)-10)); 
        nr.addView(nv); 
       } 
       ((TableLayout) findViewById(R.id.Table)).addView(nr); 
       // Scrolls to line before last - why? 
       ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 
      } 
     }); 

    } 
} 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <Button 
    android:text="Add Row" 
    android:id="@+id/AddRow" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" /> 
    <ScrollView 
    android:id="@+id/TableScroller" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@id/AddRow" 
    android:layout_alignParentTop="true" > 
    <TableLayout 
     android:id="@+id/Table" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:stretchColumns="0,1,2" /> 
    </ScrollView> 
</RelativeLayout> 

संपादित करें: संदर्भ के लिए, मैं कार्यान्वित Romain Guy के

निम्नलिखित कोड समस्या प्रतिकृति निम्नानुसार समाधान:

TestActivity.java में, बदल देते हैं:

  // Scrolls to line before last - why? 
      ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 

साथ:

  // Enqueue the scrolling to happen after the new row has been layout 
      ((ScrollView) findViewById(R.id.TableScroller)).post(new Runnable() { 
       public void run() { 
        ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 
       } 

      }); 

कौन सा ठीक काम करता है।

उत्तर

15

उस समय जब आप अपना पूर्णस्कूल() कर रहे हैं तो लेआउट अभी तक नहीं हुआ है, इसलिए स्क्रॉलव्यू तालिका के लिए "पुराने" आकार का उपयोग करता है। FullScroll() को तुरंत कॉल करने के बजाय, View.post (Runnable) का उपयोग करें।

+0

धन्यवाद - यह उन चीजों में से एक था जिस पर मुझे संदेह था लेकिन उन्हें कोई वास्तविक विचार नहीं था कि यह ठीक करना आसान होगा। थ्रेड से संबंधित सब कुछ के डर को ठीक करने में मेरी मदद करने के लिए धन्यवाद :-) – Joubarc

2

उपयोगी ऊपर दिए गए संकेत ढूँढना, यहाँ है एक सरल कार्यान्वयन है कि एक scrollview एक दिया बच्चे को दृश्यमान बनाने के लिए स्क्रॉल ...

एक: निम्नलिखित सहायक वर्ग

public class ScrollToTrick implements Runnable { 

ScrollView scroller; 
View  child; 

ScrollToTrick(ScrollView scroller, View child) { 
    this.scroller=scroller; 
    this.child=child; 

} 
public void run() { 
    scroller.scrollTo(0, child.getTop()); 
} 
} 

ख तैयार) इसे कहते इस तरह

my_scroller.post(new ScrollToTrick(my_scroller,child_to_scroll_to)); 
संबंधित मुद्दे