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.
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. –
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
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? –