0

Ich folge Android Archt. component um ein Projekt zu erstellen. Nach den Leitlinien habe ich CataloguesAdapter Verlängerung DataBoundListAdapter als einen benutzerdefinierten Adapter namens erstellt:Binding Event nicht auf Adapter

public class CataloguesAdapter extends DataBoundListAdapter<CatalogueEntity, CatalogueItemBinding> { 

    private final android.databinding.DataBindingComponent dataBindingComponent; 
    private final ContributorClickCallback callback; 
    private CatalogueItemBinding mBinding; 

    public CataloguesAdapter(DataBindingComponent dataBindingComponent, 
          ContributorClickCallback callback) { 
     this.dataBindingComponent = dataBindingComponent; 
     this.callback = callback; 
    } 

    @Override 
    protected CatalogueItemBinding createBinding(ViewGroup parent) { 
     mBinding = DataBindingUtil 
       .inflate(LayoutInflater.from(parent.getContext()), 
         R.layout.catalogue_item, parent, false, 
         dataBindingComponent); 

     //while this click event is working fine 
     mBinding.getRoot().setOnClickListener(v -> { 
      CatalogueEntity catalogueEntity = mBinding.getCatalogue(); 
      if (catalogueEntity != null && callback != null) { 
       callback.onClick(catalogueEntity); 
      } 
     }); 

     //todo:not working, this event is not firing 
     mBinding.deleteIcon.setOnClickListener(v-> callback.onItemDelete()); 

     return mBinding; 
    } 
} 

ich Swipe bin der Umsetzung Layout auf Recycler Ansicht zu löschen. Im Folgenden finden Sie die XML-Layout Listenpunkt:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="catalogue" 
      type="com.mindtree.igxbridge.traderapp.datasource.local.entity.CatalogueEntity" /> 

    </data> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:cardUseCompatPadding="true"> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

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

       <ImageView 
        android:id="@+id/delete_icon" 
        android:layout_width="@dimen/dimen_30_dp" 
        android:layout_height="@dimen/dimen_30_dp" 
        android:layout_alignParentEnd="true" 
        android:layout_centerVertical="true" 
        android:layout_marginEnd="@dimen/dimen_10_dp" 
        app:srcCompat="@drawable/ic_delete"/> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" 
        android:layout_marginEnd="@dimen/dimen_10_dp" 
        android:layout_toStartOf="@id/delete_icon" 
        android:text="@string/text_delete" 
        android:textColor="@color/Material.87.white" 
        android:textSize="14sp" /> 

      </RelativeLayout> 

      <RelativeLayout 
       android:id="@+id/view_foreground" 
       android:layout_width="match_parent" 
       android:background="#FFFFFF" 
       android:layout_height="wrap_content"> 

       <android.support.v7.widget.AppCompatImageView 
        android:id="@+id/arrow_icon" 
        android:layout_width="@dimen/dimen_30_dp" 
        android:layout_height="@dimen/dimen_30_dp" 
        android:layout_alignParentEnd="true" 
        android:layout_centerVertical="true" 
        android:layout_marginEnd="@dimen/dimen_10_dp" 
        app:srcCompat="@drawable/ic_arrow_right" />    

      </RelativeLayout> 

     </FrameLayout> 

    </android.support.v7.widget.CardView> 
</layout> 

Eine weitere Operation wie Swipe links/rechts funktioniert gut, aber auf Schaltfläche Löschen Ereignis klicken wird nicht aufgerufen zu werden.

Ich habe versucht, findViewbyId zu überprüfen und Klickereignis dadurch zu registrieren, aber kein Glück damit auch. Während CatalogueItemBinding ordnungsgemäß registriert ist, kann ich keine andere Fehlerquelle finden.

Danke.

Antwort

0

Korrigieren Sie mich, wenn ich Ihren Code missverstanden habe. Sie haben ein FrameLayout verwendet, um zwei relative Layouts übereinander zu hosten (Vordergrund und Hintergrund). Die Löschschaltfläche befindet sich im Hintergrund und der Vordergrund hat match_parent in seinem Breitenattribut. Daher denke ich, dass der Lösch-Button vom Vordergrund abgedeckt wird, was dazu führt, dass das Event nicht ausgelöst wird.

Mögliche Lösung

Versuchen auf die Schaltfläche Löschen im Vordergrund enthält. Es ist sinnvoll, UI-Komponenten in den Vordergrund zu stellen.

+0

Ich habe Swipe zum Löschen implementiert. Während swiping view_background erscheint, erscheint die Schaltfläche Delete. Ich sollte also auf die Schaltfläche Löschen klicken können. – prdp89

0

Ich glaube, Sie vergessen zu sagen, Ihre Adapter-Klasse, wo Ihre XML festgelegt ist oder nicht zu Adapter-Klasse. Erstellen Sie einfach eine Variable in XML, die Ihre Adapterklasse importieren wird.

<variable 
    name="myAdapter" 
    type="import your adapter class"> 
</variable> 

Setzen Sie diese Variable nun auf Ihren Adapter.

@Override 
    protected CatalogueItemBinding createBinding(ViewGroup parent) { 
     mBinding = DataBindingUtil 
       .inflate(LayoutInflater.from(parent.getContext()), 
         R.layout.catalogue_item, parent, false, 
         dataBindingComponent); 
     mBinding .setmyAdapter(this);  
     return mBinding; 
    } 
} 

dann funktioniert Ihr Klick. Hoffe es wird dir helfen.

+0

Hey Hemant, ich habe alle drei Optionen ausprobiert: mBinding.setAdapter (this); mBinding.setVariable (R.layout.catalogue_item, this); mBinding.executePendingBindings(); Es hat nicht funktioniert, kein anderer Vorschlag. – prdp89

+0

Nach dem Set-Adapter müssen Sie Click Listener-Ereignis aufrufen, wo Sie die Löschfunktion aufrufen möchten. –

+0

ja ich mache es so: // todo: funktioniert nicht mBinding.deleteIcon.setOnClickListener (v-> callback.onItemDelete()); und der Rückruf wird ebenfalls entsprechend implementiert. – prdp89

Verwandte Themen