Gibt es eine Möglichkeit, eine onClickListener
auf eine RecyclerView
zu setzen?Wie bekomme ich Klicks auf RecyclerView (NICHT die Kinder)
Ich habe ein RecyclerView
mit einigen Kindern in ihnen, und auf dem übergeordneten RecyclerView
ein OnClickListener
Einstellung. Die onClick
wird jedoch nicht ausgelöst, wenn ich auf diese Ansicht klicke. Siehe Beispielcode unten - wir möchten Klicks auf die Eltern, NICHT die Kinder bekommen. In diesem Szenario sind Klicks auf die Elemente nicht relevant.
Ich habe versucht, setFocusable(false)
, setClickable(false)
und setOnClickListener(null)
auf die Kinder ohne Erfolg zu tun. Auf jeden Fall glaube ich nicht, dass die Kinder Klicks von den Eltern klauen, denn wenn ich auf den Bereich klicke, in dem keine Kinder sind, werden auch die Klicks nicht registriert.
package com.formagrid.hellotest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
public class HelloActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new RecyclerAdapter(Arrays.asList("hi", "this", "is", "some", "text"));
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("patricia", view.toString());
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> {
public class Holder extends RecyclerView.ViewHolder {
protected TextView textView;
public Holder(TextView itemView) {
super(itemView);
this.textView = itemView;
}
}
private List<String> contents;
public RecyclerAdapter(List<String> contents) {
this.contents = contents;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Holder(new TextView(parent.getContext()));
}
@Override
public void onBindViewHolder(Holder holder, int position) {
holder.textView.setText(contents.get(position));
}
@Override
public int getItemCount() {
return contents.size();
}
}
}
das könnte haarig für uns werden. Wissen Sie, warum 'RecyclerView' nie' performClick' aufruft? –
Nun, Sie müssten die Designer um eine definitive Antwort bitten, aber IMO, es ist, weil es nie so verwendet werden sollte. Wenn Sie dem Benutzer eine Liste präsentieren, sind Sie eher mit der Interaktion der einzelnen Elemente beschäftigt. Wie könnte das für dich haarig werden? Wenn Sie über den zusätzlichen Code besorgt sind, können Sie dies in einer 'RecyclerView'-Unterklasse implementieren, um den Code Ihrer' Aktivität 'nicht zu verschmutzen. Oder, wenn Sie meinen, dass Sie bereits Gesten verwenden, müsste diese Funktionalität nur zu dem hinzugefügt werden, was Sie bereits haben. –
Wenn Sie Ihren 'OnClickListener' verwenden, können Sie' RecyclerView' von der Unterklasse '' performClick() 'selbst ableiten, aber Sie müssen die Berührungsereignisse verfolgen, um zwischen einem einfachen Klick zu unterscheiden und z. Ziehen, aber das ist im Grunde alles, was der GestureDetector sowieso macht. –