2017-10-30 3 views
-1

Ich habe eine Adapter, die RecyclerView.Adapter erweitert. Jede Zeile des Adapters ist eine benutzerdefinierte FrameLayout mit GestureDetector implementiert. Die FrameLayout xml Datei hat 2 RelativeLayout. In diesem FrameLayout ich Umleitung X-und Y-Positionen auf die RelativeLayout, die im Vordergrund ist.Scrollen und clicklistener auf Ansichten

In jedem RelativeLayout habe ich eine setOnClickListener. Dies liegt daran, dass, wenn der Benutzer auf im Vordergrund klickt, eine activity gestartet wird. Wenn der Benutzer den ersten scrollt, steht letzterer zum Klicken zur Verfügung.

Was ich vor mir habe ist: Implementieren setOnClickListener auf diesen Layouts Ich verlor Ansicht Scroll-Funktion meiner benutzerdefinierten FrameLayout. Und ich brauche die Scroll-Funktion und clickListener für jede Ansicht.

Das ist mein xml

file: 

    <?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:id="@+id/background_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/work_order_deleted_item_background_color"> 

    ... 
    </RelativeLayout> 
    <RelativeLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white" 
     android:visibility="invisible" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin"> 

     ... 
    </RelativeLayout> 
</FrameLayout> 

Meine individuelle FrameLayout:

public class SwipeView extends FrameLayout implements GestureDetector.OnGestureListener{ 
    private RelativeLayout container; 
    private RelativeLayout backgroundContainer; 
    private GestureDetector detector; 
    private float posX; 
    private float posY; 
    private float lastTouchX; 
    private float lastTouchY; 
    private float xLimit; 

    private int mActivePointerId; 

    public SwipeView(@NonNull Context context) { 
     super(context); 
     LayoutInflater.from(context).inflate(R.layout.adapter_work_order, this); 
     initViews(context, null); 

     xLimit = 200.0f; 
     mActivePointerId = INVALID_POINTER_ID; 
     detector = new GestureDetector(this); 
    } 

    public SwipeView(@NonNull Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
     initViews(context, attrs); 

     xLimit = 200.0f; 
     mActivePointerId = INVALID_POINTER_ID; 
     detector = new GestureDetector(this); 
    } 

    public SwipeView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initViews(context, attrs); 

     xLimit = 200.0f; 
     mActivePointerId = INVALID_POINTER_ID; 
     detector = new GestureDetector(this); 
    } 

    private void initViews(Context context, AttributeSet attrs){ 
     this.container = this.findViewById(R.id.container); 
     this.backgroundContainer = this.findViewById(R.id.background_container); 
     this.checkboxDownload = this.findViewById(R.id.checkbox_download); 
     this.textviewWo = this.findViewById(R.id.textview_wo); 
     this.downloadedWo = this.findViewById(R.id.textview_downloaded_wo); 
     this.textviewTime = this.findViewById(R.id.textview_time); 
     this.textviewField1 = this.findViewById(R.id.textview_field_1); 
     this.textviewField2 = this.findViewById(R.id.textview_field_2); 
     this.textviewField3 = this.findViewById(R.id.textview_field_3); 
     this.deleteLabel = this.backgroundContainer.findViewById(R.id.delete_wo); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     final int action = MotionEventCompat.getActionMasked(event); 

     switch (action) { 
      case MotionEvent.ACTION_DOWN: { 
       final int pointerIndex = MotionEventCompat.getActionIndex(event); 
       final float x = MotionEventCompat.getX(event, pointerIndex); 
       final float y = MotionEventCompat.getY(event, pointerIndex); 

       // Remember where we started (for dragging) 
       lastTouchX = x; 
       lastTouchY = y; 
       // Save the ID of this pointer (for dragging) 
       mActivePointerId = MotionEventCompat.getPointerId(event, 0); 

       if(x > container.getRight() + container.getX()){ 
        Log.e("ERROR", "TOUCHED OUTSIDE"); 
       } 
       else { 
        Log.e("ERROR", "TOUCHED INSIDE: "); 
       } 
        break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       // Find the index of the active pointer and fetch its position 
       final int pointerIndex = MotionEventCompat.findPointerIndex(event, mActivePointerId); 

       final float x = MotionEventCompat.getX(event, pointerIndex); 
       final float y = MotionEventCompat.getY(event, pointerIndex); 

       // Calculate the distance moved 
       final float dx = x - lastTouchX; 
       final float dy = y - lastTouchY; 

       posX += dx; 
       posY += dy; 

       if(posX <= -xLimit){ 
        posX -= dx; 
       } 

       if(posX > 0.0f){ 
        posX = 0.0f; 
       } 

       invalidate(); 

       // Remember this touch position for the next move event 
       lastTouchX = x; 
       lastTouchY = y; 

       container.setX(posX); 
       break; 
      } 
      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 
     } 

     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent motionEvent) { 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent motionEvent) { 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent motionEvent) { 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent motionEvent) { 
    } 

    @Override 
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float velocityX, float velocityY) { 
     return true; 
    } 
} 

Und dieser Code ist in meinem Adapter:

holder.container.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //onItemClickListener.onItemClick(workOrder); 
       Log.e("ERROR", "FOREGROUND CLICKED"); 
      } 
     }); 

     holder.backgroundContainer.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view){ 
       Log.e("ERROR", "BACKGROUND CLICKED"); 
      } 
     }); 

Schließlich ist dies der Code, der in meiner Aktivität:

((MyAdapter) recyclerview.getAdapter()) 
       .setOnItemClickListener(new MyAdapter.OnItemClickListener() { 
      @Override 
      public void onItemClick(Item item) { 
       if(!presenter.getDownloadAvailability()) { 
        ... 
       } 
      } 
     }); 

Antwort

0
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="10dp" 
    android:fillViewport="false"> 
    <RelativeLayout 
     android:id="@+id/background_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/work_order_deleted_item_background_color"> 

    ... 
    </RelativeLayout> 
</ScrollView> 
+0

Dies löst nicht das Problem. Weder berücksichtigt Vordergrund Ansicht und Klicks in jedem von ihnen. – learner

+0

Im Adapter: Adapter: implementiert View.OnClickListener, halter.setOnClickListener (this); Öffentlich void onClick (View v) { if (v.getId() == R.id.holder) { }} –

Verwandte Themen