0

Ich bin neu in der Android-Programmierung und versuche, einen Klick-Listener zu setzen, um eine andere Aktivität zu öffnen. Die Liste wird geladen, aber wenn ich auf die Elemente klicke, passiert nichts. Das ist mein Adapter:Versuch, einen Klick-Listener auf eine RecyclerView zu setzen

public interface OnItemClickListener { 
    void onItemClick(Product product); 
} 

private List<Product> productList; 
private double currentLatitude, currentLongitude; 
private Context context; 
private final OnItemClickListener listener; 

public AdapterForProducts(List<Product> productList, OnItemClickListener listener, double currentLatitude, double longitude, Context context){ 
    this.currentLatitude = currentLatitude; 
    this.currentLongitude = longitude; 
    this.productList = productList; 
    this.context = context; 
    this.listener = listener; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false); 
    ViewHolderForProducts holder = new ViewHolderForProducts(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    //Use the provided View Holder on the onCreateViewHolder method to populate the current row on the RecyclerView 
    ViewHolderForProducts holder = (ViewHolderForProducts) viewHolder; 

    Product product = productList.get(position); 
    String distanceText = "Distancia: " + round(distance(product.getLatitude(), product.getLongitude())) + " meters"; 
    holder.bind(productList.get(position), listener, distanceText); 


} 

@Override 
public int getItemCount() { 
    return productList.size(); 
} 

die viewHolder:

public ViewHolderForProducts(View view){ 
    super(view); 
    cardView = (CardView) itemView.findViewById(R.id.cardView); 
    name = (TextView) view.findViewById(R.id.product_name); 
    value = (TextView) view.findViewById(R.id.product_value); 
    distance = (TextView) view.findViewById(R.id.product_distance); 
} 



public void bind(final Product product, final AdapterForProducts.OnItemClickListener listener, 
       String distanceText) { 
    name.setText(product.getName()); 
    value.setText("Preço: " + product.getValue()); 

    distance.setText(distanceText); 

    itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      listener.onItemClick(product); 
     } 
    }); 

} 

Und ich es in der Tätigkeit wie folgt bin Aufruf:

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search_and_show_product_list); 

    Bundle extras = getIntent().getExtras(); 

    if (extras != null) { 
     latitude = extras.getDouble("latitude"); 
     longitude = extras.getDouble("longitude"); 
    } 
    query = ""; 
    query_field = (EditText) findViewById(R.id.query_field); 
    searchButton = (Button) findViewById(R.id.searchProductButton); 

    requestQueue = Volley.newRequestQueue(getApplicationContext()); 

    recyclerView = (RecyclerView) findViewById(R.id.recycler); 
    productList = new ArrayList<>(); 

    fillProductListByName(); 

    adapterForProducts = new AdapterForProducts(productList, new AdapterForProducts.OnItemClickListener() { 
     @Override 
     public void onItemClick(Product product) { 
      showProductOnMap(product); 
     } 
    }, latitude, longitude, getApplication()); 

    recyclerView.setAdapter(adapterForProducts); 
    adapterForProducts.notifyDataSetChanged(); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    searchButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      query = query_field.getText().toString(); 
      productList.clear(); 
      fillProductListByName(); 
      adapterForProducts.notifyDataSetChanged(); 

     } 
    }); 
} 

Dies ist die Liste Artikel xml:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/cardView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="@dimen/activity_vertical_margin" 
    android:clickable="true" 
    android:focusable="true" 
    android:foreground="?android:attr/selectableItemBackground" 
    app:cardCornerRadius="@dimen/activity_vertical_margin" 
    app:cardElevation="@dimen/activity_vertical_margin"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/colorAccent" 
     android:clickable="true" 
     android:padding="16dp"> 

     <ImageView 
      android:id="@+id/imageView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginRight="16dp" /> 

     <TextView 
      android:id="@+id/product_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/imageView" 
      android:layout_toRightOf="@+id/imageView" 
      android:text="Product Name" 
      android:textSize="14sp" /> 

     <TextView 
      android:id="@+id/product_value" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="15dp" 
      android:layout_marginStart="15dp" 
      android:layout_toRightOf="@+id/product_name" 
      android:text="Price: " /> 

     <TextView 
      android:id="@+id/product_distance" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="51dp" 
      android:layout_marginStart="51dp" 
      android:layout_toEndOf="@+id/product_value" 
      android:layout_toRightOf="@+id/product_value" 
      android:text="Distance:" /> 

    </RelativeLayout> 

Antwort

0

Ich habe es funktioniert. Offenbar geht diese Umsetzung nicht funktionieren, wenn es ein anderes anklickbare Objekt innerhalb des Listenelementes ist, wie es der Fall mit war:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorAccent" 
    android:clickable="true" 
    android:padding="16dp"> 

Alles, was ich tat, war die Android zu löschen: anklickbare = „true“ aus dem RelativeLayout

0

wenn Sie die attr android:clickable="true" auf das übergeordnete Layout gesetzt, seine Klick-Methode

itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      listener.onItemClick(product); 
     } 
    }); 

wird nur dann, wenn sein childs nicht die clickable = true oder einen OnClickListener gesetzt haben hat aufgerufen werden.

Eigentlich brauchen Sie nicht alle diese android:clickable="true".

Wenn Sie android:clickable="true" einstellen, setzen Sie eine leere ClickListener auf diese Ansicht.

Das Klickereignis wird an die unterste Ansicht in der Layouthierarchie übergeben, wobei ein ClickListener implementiert ist, selbst wenn der Text leer ist. Dies ist die Ursache für Ihren Fehler, und deshalb müssen Sie die android:clickable="true" entfernen. die android:clickable="true" Entfernen, entfernt die leeren ClickListener, und jetzt die niedrigste Ansicht in der Layout-Hierarchie ist die CardView mit diesem clicklistener:

itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.onItemClick(product); 
      } 
     }); 

Also, das ist die ClickListener, die aufgerufen wird.

+0

Danke für die Erklärung! Ich habe ein anderes Problem mit diesem Code, vielleicht können Sie mir helfen? Ich verwende diese Recycler-Ansicht, um Suchergebnisse anzuzeigen. In der gleichen Aktivität gibt es die Ansicht, einen Editiertext und eine Suchschaltfläche, aber aus irgendeinem Grund erscheint der Recycler nur, nachdem ich den Editiertext berührt habe, wenn die Tastatur erscheint. Wenn ich dann suche und die Elemente ändern, erscheint es erst wieder, nachdem sich die Tastatur versteckt hat. Irgendwelche Hinweise darauf, was passieren könnte? Ich werde den Code für die Aktivität veröffentlichen. –

Verwandte Themen