[英]Problem in making the items in RecyclerView clickable
我知道有這樣的問題,但沒有解決我的問題..
我正在嘗試制作'RecyclerView'的'OnItemClickListener',但是當我運行應用程序時它停止了..
你能告訴我錯誤在哪里嗎??
這是代碼:(注意錯誤在於使項目可點擊)
public class TeacherActivity extends AppCompatActivity {
private FirebaseAuth mAuth=FirebaseAuth.getInstance();
private FirebaseUser currentUser= mAuth.getCurrentUser();;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private String UserId =currentUser.getUid();
private static String city;
private TeacherAdapter teacherAdapter;
public static final String EXTRA_PATH = "com.example.exercise.EXTRA_PATH";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_teacher);
setUpRecyclerView();
teacherAdapter.setOnItemClickListener(new TeacherAdapter.OnItemClickListener() {
@Override
public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
String path = documentSnapshot.getReference().getPath();
Intent intent = new Intent(TeacherActivity.this, SecondActivity.class);
intent.putExtra(EXTRA_PATH, path);
startActivity(intent);
}
});
}// end of onCreate
private void setUpRecyclerView(){
Query query = db.collection("Teachers");
FirestoreRecyclerOptions < Teacher > options = new
FirestoreRecyclerOptions.Builder<Teacher>()
.setQuery(query, Teacher.class)
.build();
teacherAdapter = new TeacherAdapter(options);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true); //for performane reasons
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(teacherAdapter);
teacherAdapter.startListening();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
teacherAdapter.stopListening();
}
}// end of class
這是“RecyclerView”的“適配器”:
public class TeacherAdapter extends FirestoreRecyclerAdapter<Teacher,
TeacherAdapter.TeacherHolder> {
private OnItemClickListener listener;
public TeacherAdapter(@NonNull FirestoreRecyclerOptions<Teacher> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull TeacherHolder holder, int i, @NonNull Teacher
teacher) {
holder.tv_teacher_name.setText(teacher.getName());
holder.tv_cv.setText(teacher.getCv());
}
@NonNull
@Override
public TeacherHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.teacher_item, parent, false);
return new TeacherHolder(v);
}
class TeacherHolder extends RecyclerView.ViewHolder {
TextView tv_teacher_name;
TextView tv_cv;
public TeacherHolder(@NonNull View itemView) {
super(itemView);
tv_teacher_name = itemView.findViewById(R.id.teacher_name);
tv_cv = itemView.findViewById(R.id.tv_cv);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION && listener != null){
listener.onItemClick(getSnapshots().getSnapshot(position), position);
}
}
});
}
}
public interface OnItemClickListener{
void onItemClick(DocumentSnapshot documentSnapshot, int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
this.listener = listener;
}
}
logcat 的一部分:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.exercise, PID: 29966 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.exercise/com.example.exercise.TeacherActivity}: java.lang. NullPointerException: Attempt to invoke virtual method 'void com.example.exercise.TeacherAdapter.setOnItemClickListener(com.example.exercise.TeacherAdapter$OnItemClickListener)' on a null object reference
您收到以下錯誤:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.exercise, PID: 29966 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.exercise/com.example.exercise.TeacherActivity}: java.lang. NullPointerException: Attempt to invoke virtual method 'void com.example.exercise.TeacherAdapter.setOnItemClickListener(com.example.exercise.TeacherAdapter$OnItemClickListener)' on a null object reference
因為您在當時的teacherAdapter
object 上調用.setOnItemClickListener()
,即null
。 要解決這個問題,您只需移動以下代碼塊:
teacherAdapter.setOnItemClickListener(new TeacherAdapter.OnItemClickListener() {
@Override
public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
String path = documentSnapshot.getReference().getPath();
Intent intent = new Intent(TeacherActivity.this, SecondActivity.class);
intent.putExtra(EXTRA_PATH, path);
startActivity(intent);
}
});
在你的適配器聲明之后:
teacherAdapter = new TeacherAdapter(options);
在您的setUpRecyclerView()
方法中,您的問題將得到解決。
將 setOnClickListener 代碼放在適配器 class 中的 onBindViewHolder 中,它應該可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.