2016-06-13 2 views
0

Ich habe die Frage nicht auf eine gute Art und Weise beschrieben, so bearbeite ich die Frage, um klar zu sein.notifyDataSetChanged() Aktualisieren Sie das gesamte Layout

Ich bin so verwirrt darüber nach: Ich schrieb einen RelativeLayout mit einem DragViewGroup und einem gridview, und ich bemerkte, dass jedes Mal, wenn ich notifyDatasetChanged() verwenden Methode würde dazu führen, den DragViewGroup tun die Neuzeichnung Ding. Und die DragViewGroup erstreckt sich von LinearLayout, die ViewDragHelper verwendet, so konnte ich nicht die Position schon gescrollt zu halten.

Hier ist meine XML-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 
<com.xxxx.DragViewGroup 
    android:id="@+id/dragview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#3f83f7" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="665dp" 
     android:orientation="vertical"> 
     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="310dp" 
      android:id="@+id/mainview" 
      > 

      ... 

     </RelativeLayout> 

     <include 
      android:layout_width="match_parent" 
      android:layout_height="355dp" 
      android:layout_marginBottom="62dp" 
      layout="@layout/fake_panel" /> 

    </LinearLayout> 
</com.xxxx.DragViewGroup> 
<RelativeLayout 
    android:layout_width="match_parent" 
    android:id="@+id/layout" 
    android:layout_alignParentBottom="true" 
    android:layout_height="210dp" 
    android:background="#ffffff" 
    android:clickable="true" 
    > 

    <HorizontalScrollView 
     android:id="@+id/btn_scroll_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:overScrollMode="never" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="26dp" 
     android:scrollbars="none"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <GridView 
       android:id="@+id/list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_margin="10dp" 
       android:listSelector="@color/transparent" 
       android:horizontalSpacing="6dp" 
       android:scrollbars="none" /> 
     </LinearLayout> 
    </HorizontalScrollView> 

    <com.xxxx.UniversalSeekBar 
     .... 
     android:layout_marginTop="18dp"/> 
</RelativeLayout> 

</RelativeLayout> 

DragViewGroup Code:

public class DragViewGroup extends LinearLayout { 
    private ViewDragHelper viewDragHelper; 
    private View mainView; 
    private int mainHeight; 



public DragViewGroup(Context context) { 
    super(context); 
    initView(); 
} 

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

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

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    mainView = getChildAt(0); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    mainHeight = mainView.findViewById(R.id.mainview).getMeasuredHeight(); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return viewDragHelper.shouldInterceptTouchEvent(ev); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    viewDragHelper.processTouchEvent(event); 
    return true; 
} 

@Override 
public void computeScroll() { 
    if (viewDragHelper.continueSettling(true)) { 
     ViewCompat.postInvalidateOnAnimation(this); 
    } 
} 

private void initView() { 
    viewDragHelper = ViewDragHelper.create(this, callback); 
} 

private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() { 
    @Override 
    public boolean tryCaptureView(View child, int pointerId) { 
     return mainView == child; 
    } 

    @Override 
    public int clampViewPositionHorizontal(View child, int left, int dx) { 
     return 0; 
    } 

    @Override 
    public int clampViewPositionVertical(View child, int top, int dy) { 
     return top; 
    } 

    @Override 
    public void onViewReleased(View releasedChild, float xvel, float yvel) { 
     super.onViewReleased(releasedChild, xvel, yvel); 
     if (mainView.getTop() > -500) { 
      viewDragHelper.smoothSlideViewTo(mainView, 0, 0); 
      ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); 

     } else { 
      viewDragHelper.smoothSlideViewTo(mainView, 0, -mainHeight); 
      ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); 

     } 
    } 

}; 

} 

Sobald ich die notifyDatasetChanged() -Methode verwenden, um die Gridview zu aktualisieren, meine DragViewGroup in die ursprüngliche Position gleiten selbst obwohl Es wurde zuvor gezogen. Anscheinend zeichnet die Methode das gesamte Layout, anstatt nur die Gridview selbst zu zeichnen.

Ich brauche die gezogene Position DragViewGroup zu halten, habe ich versucht, außer Kraft OnDraw-Methode in DragViewGroup wie folgen aus:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    // set isDragged label in onViewReleased() 
    if (isDragged) { 
     viewDragHelper.smoothSlideViewTo(main, 0, -mainHeight); 
    } 
} 

Es funktioniert, aber es ist ein sichtbares Schiebeverfahren, das will ich nicht. Hoffe jemand könnte mir helfen. Vielen Dank.

+0

Scroll hat keine solche Methode für 'notifyDataSetChanged()'; Diese Methode gehört zu [der BaseAdapter-Klasse] (https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()) und ist normalerweise mit ListViews, GridViews oder RecyclerViews verknüpft. –

+0

Ja, das weiß ich. Ich meine, dass ich notifyDataSetChange() verwende, um nur die GridView zu aktualisieren, während die scrollView in derselben Aktivität entweder neu gezeichnet wurde. – toscanininini

+0

Wenn Sie diese Methode auf Ihrem Adapter aufrufen, wird ein Layout in Ihrer GridView übergeben, so dass alle Listenelemente gemessen und im Layout platziert werden können. Wenn die GridView-Größe genau ist, sollte der Layout-Durchlauf nicht in der Layout-Hierarchie fortgesetzt werden. Vielleicht haben Sie 'wrap_content' als eine seiner Dimensionen angegeben? –

Antwort

0

Shop ScrollValue zum Zeitpunkt der die Ansicht scrollen, und verwenden Sie setSelectionMethod nur auf Ihrem gridview

gridview.setOnScrollListener(new OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 
      int count = gridview.getCount(); 
       if (scrollState == SCROLL_STATE_IDLE) { 
        if (gridview.getLastVisiblePosition() >= count 
          - 1) { 
         scrollPos = <positionOfList>; 
        } 
       } 
} 
}); 

Hier geben Sie Ihre letzte Position insted „positionOfList“ Und gerade nach dem Aufruf notifydatasetChanged() -Aufruf gridview. setSelection (scrollPos)

Hoffe, das wird Ihnen helfen!

+0

Danke.Aber ich frage mich nur, warum der Scrollview auch neu gezeichnet wird. Ich dachte notifyDataSetChanged refresh listview/gridview selbst. – toscanininini

+0

Wenn Ihre Gridview in ScrollView ist, dann tun Sie das nicht, Gridview hat eine eigene Scroll-Ansicht, Sie müssen keine Scrollview auf die GridView setzen –

0

Verwenden Sie einfach unten Code in der Klasse, die Sie Anzeige aktualisieren:

int index = myList.getFirstVisiblePosition(); 
    View v = myList.getChildAt(0); 
    int top = (v == null) ? 0 : v.getTop(); 

    myList.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
    myList.setSelectionFromTop(index, top); 
+0

Danke, aber meine minimale API-Ebene ist 11, finde ich, dass die Methode setSelectionFromTop mindestens benötigt API 21. – toscanininini