如何在 View Holder 上的 OnClick Adapter 中不获取 null 的情况下获取 AdapterPositions?
How to getAdapterPositions without getting null in OnClick Adapter on View Holder?
我喜欢尝试使用简单的 toast 获取位置,我得到了它,但是当我尝试将它用于界面时出现错误
ListActivity
public class ListActivity extends BaseActivity implements ListAdapter.OnClickListenerAdapterList {
private DatabaseReference databaseReference;
private RecyclerView labelRecycleView;
private ArrayList<DataFirebase> listLabel = new ArrayList<>();
private ListAdapter listAdapter;
private Button bInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
findView();
setDataToList();
initListener();
}
private void setDataToList() {
simpleway.progressDialog(ListActivity.this);
databaseReference.child("Username").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
DataFirebase modelClass = dataSnap.getValue(DataFirebase.class);
modelClass.setLabel(dataSnap.getKey());
listLabel.add(modelClass);
}
putLayoutManager();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
simpleway.stopProgressDialog();
}
});
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
labelRecycleView.setLayoutManager(layoutManager);
labelRecycleView.setItemAnimator(new DefaultItemAnimator());
}
private void putLayoutManager() {
listAdapter = new ListAdapter(ListActivity.this, listLabel, this);
labelRecycleView.setAdapter(listAdapter);
simpleway.stopProgressDialog();
}
@Override
public void findView() {
databaseReference = FirebaseDatabase.getInstance().getReference();
labelRecycleView = findViewById(R.id.listRecyclerVIew);
bInput = findViewById(R.id.inputData);
}
@Override
public void initListener() {
bInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
simpleway.startnextActivity(ListActivity.this, InputActivity.class);
}
});
}
@Override
public void OnClickPositionsAndValue(String enough) {
TitleFragment titleFragment = new TitleFragment();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager()
.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("Check", enough);
titleFragment.setArguments(bundle);
fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right,
R.anim.enter_from_right, R.anim.exit_to_right)
.replace(R.id.container_layout, titleFragment)
.addToBackStack(null)
.commit();
}
}
列表适配器
public class ListAdapter 扩展 RecyclerView.Adapter {
private Simpleway simpleway;
private ArrayList<DataFirebase> dataList;
private AppCompatActivity someActivity;
private Fragment fragmentActivity;
private OnClickListenerAdapterList onClickListenerAdapterList;
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
simpleway = new Simpleway();
}
public ListAdapter(Fragment fragmentActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.fragmentActivity = fragmentActivity;
simpleway = new Simpleway();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_label, viewGroup, false);
return new ViewHolder(view, onClickListenerAdapterList);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int positions) {
final DataFirebase labelList = dataList.get(positions);
viewHolder.textLabel.setText(labelList.getLabel());
String enough = labelList.getLabel();
}
@Override
public int getItemCount() {
return dataList.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
LinearLayout linearLabel;
TextView textLabel;
OnClickListenerAdapterList monClickListenerAdapterList;
ViewHolder(@NonNull View itemView, OnClickListenerAdapterList onClickListenerAdapterList) {
super(itemView);
textLabel = itemView.findViewById(R.id.text_label);
linearLabel = itemView.findViewById(R.id.linearLabel);
monClickListenerAdapterList = onClickListenerAdapterList;
linearLabel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
simpleway.toastMessage(someActivity.getApplicationContext(), String.valueOf(getAdapterPosition()));
monClickListenerAdapterList.OnClickPositionsAndValue(getAdapterPosition());
}
}
public interface OnClickListenerAdapterList{
void OnClickPositionsAndValue(int positions);
}
}
大多数情况下,当我尝试获取 AdapterPositions 时,我得到的错误是这样的。
错误
java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.parzival.flashcard.adapter.ListAdapter$OnClickListenerAdapterList.OnClickPositionsAndValue(int)' on a null object reference
at com.example.parzival.flashcard.adapter.ListAdapter$ViewHolder.onClick(ListAdapter.java:90)
如何获取适配器位置?我的界面有问题吗?
问题似乎是您的 monClickListenerAdapterList
为空。
如果您查看 ListAdapter
class 的构造函数,您会看到:
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
simpleway = new Simpleway();
}
但是请注意,尽管您将 OnClickListenerAdapterList onClickListenerAdapterList
作为参数传入,但您从未在构造函数中调用 this.onClickListenerAdapterList = onClickListenerAdapterList;
。
因此,您只是传入侦听器,但从不存储它...因此 ListAdapter 的 onClickListenerAdapterList 实际上仍然为 null。
因此,当您将 onClickListenerAdapterList 传递给您的 ViewHolders 时,您实际上传递了仍然为空的 onClickListenerAdapterList。
因此,要修复您的错误,只需将您的构造函数更改为:
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
this.onClickListenerAdapterList = onClickListenerAdapterList;
simpleway = new Simpleway();
}
我喜欢尝试使用简单的 toast 获取位置,我得到了它,但是当我尝试将它用于界面时出现错误
ListActivity
public class ListActivity extends BaseActivity implements ListAdapter.OnClickListenerAdapterList {
private DatabaseReference databaseReference;
private RecyclerView labelRecycleView;
private ArrayList<DataFirebase> listLabel = new ArrayList<>();
private ListAdapter listAdapter;
private Button bInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
findView();
setDataToList();
initListener();
}
private void setDataToList() {
simpleway.progressDialog(ListActivity.this);
databaseReference.child("Username").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
DataFirebase modelClass = dataSnap.getValue(DataFirebase.class);
modelClass.setLabel(dataSnap.getKey());
listLabel.add(modelClass);
}
putLayoutManager();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
simpleway.stopProgressDialog();
}
});
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
labelRecycleView.setLayoutManager(layoutManager);
labelRecycleView.setItemAnimator(new DefaultItemAnimator());
}
private void putLayoutManager() {
listAdapter = new ListAdapter(ListActivity.this, listLabel, this);
labelRecycleView.setAdapter(listAdapter);
simpleway.stopProgressDialog();
}
@Override
public void findView() {
databaseReference = FirebaseDatabase.getInstance().getReference();
labelRecycleView = findViewById(R.id.listRecyclerVIew);
bInput = findViewById(R.id.inputData);
}
@Override
public void initListener() {
bInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
simpleway.startnextActivity(ListActivity.this, InputActivity.class);
}
});
}
@Override
public void OnClickPositionsAndValue(String enough) {
TitleFragment titleFragment = new TitleFragment();
FragmentTransaction fragmentTransaction =
getSupportFragmentManager()
.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("Check", enough);
titleFragment.setArguments(bundle);
fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right,
R.anim.enter_from_right, R.anim.exit_to_right)
.replace(R.id.container_layout, titleFragment)
.addToBackStack(null)
.commit();
}
}
列表适配器 public class ListAdapter 扩展 RecyclerView.Adapter {
private Simpleway simpleway;
private ArrayList<DataFirebase> dataList;
private AppCompatActivity someActivity;
private Fragment fragmentActivity;
private OnClickListenerAdapterList onClickListenerAdapterList;
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
simpleway = new Simpleway();
}
public ListAdapter(Fragment fragmentActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.fragmentActivity = fragmentActivity;
simpleway = new Simpleway();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_label, viewGroup, false);
return new ViewHolder(view, onClickListenerAdapterList);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int positions) {
final DataFirebase labelList = dataList.get(positions);
viewHolder.textLabel.setText(labelList.getLabel());
String enough = labelList.getLabel();
}
@Override
public int getItemCount() {
return dataList.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
LinearLayout linearLabel;
TextView textLabel;
OnClickListenerAdapterList monClickListenerAdapterList;
ViewHolder(@NonNull View itemView, OnClickListenerAdapterList onClickListenerAdapterList) {
super(itemView);
textLabel = itemView.findViewById(R.id.text_label);
linearLabel = itemView.findViewById(R.id.linearLabel);
monClickListenerAdapterList = onClickListenerAdapterList;
linearLabel.setOnClickListener(this);
}
@Override
public void onClick(View v) {
simpleway.toastMessage(someActivity.getApplicationContext(), String.valueOf(getAdapterPosition()));
monClickListenerAdapterList.OnClickPositionsAndValue(getAdapterPosition());
}
}
public interface OnClickListenerAdapterList{
void OnClickPositionsAndValue(int positions);
}
}
大多数情况下,当我尝试获取 AdapterPositions 时,我得到的错误是这样的。
错误
java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.parzival.flashcard.adapter.ListAdapter$OnClickListenerAdapterList.OnClickPositionsAndValue(int)' on a null object reference
at com.example.parzival.flashcard.adapter.ListAdapter$ViewHolder.onClick(ListAdapter.java:90)
如何获取适配器位置?我的界面有问题吗?
问题似乎是您的 monClickListenerAdapterList
为空。
如果您查看 ListAdapter
class 的构造函数,您会看到:
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
simpleway = new Simpleway();
}
但是请注意,尽管您将 OnClickListenerAdapterList onClickListenerAdapterList
作为参数传入,但您从未在构造函数中调用 this.onClickListenerAdapterList = onClickListenerAdapterList;
。
因此,您只是传入侦听器,但从不存储它...因此 ListAdapter 的 onClickListenerAdapterList 实际上仍然为 null。
因此,当您将 onClickListenerAdapterList 传递给您的 ViewHolders 时,您实际上传递了仍然为空的 onClickListenerAdapterList。
因此,要修复您的错误,只需将您的构造函数更改为:
public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
OnClickListenerAdapterList onClickListenerAdapterList) {
this.dataList = dataList;
this.someActivity = someActivity;
this.onClickListenerAdapterList = onClickListenerAdapterList;
simpleway = new Simpleway();
}