android - 如何在 View Holder 上的 OnClick Adapter 中不获取 null 的情况下获取 AdapterPositions?

标签 android firebase adapter

我喜欢尝试使用简单的 toast 获取位置,我得到了它,但是当我尝试将它用于界面时出现错误

列表 Activity

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)类 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 类的构造函数,您会看到:

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 传递给您的 ViewHolder 时,您实际上传递了仍然为 null 的 onClickListenerAdapterList。

因此,要修复您的错误,只需将您的构造函数更改为:

public ListAdapter(AppCompatActivity someActivity, ArrayList<DataFirebase> dataList,
                       OnClickListenerAdapterList onClickListenerAdapterList) {
        this.dataList = dataList;
        this.someActivity = someActivity;
        this.onClickListenerAdapterList = onClickListenerAdapterList;
        simpleway = new Simpleway();
    }

关于android - 如何在 View Holder 上的 OnClick Adapter 中不获取 null 的情况下获取 AdapterPositions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525947/

相关文章:

Android - Intent 返回后似乎不会调用 Activity

java - Android 架构组件和 MVVM 的错误处理

android - 需要使用 webservice 传输 .apk 文件

java - Firebase - 重复插入数据库

javascript - 在 const javascript React Native 中调用函数

android - ListView 抛出 NoSuchElementException

java - 从 RecyclerView 的适配器设置 ImageView 颜色过滤器

Android:使用加速度计检测轻弹

firebase - 如何将用户添加到主题以获取 firebase 推送通知

java - Webmethods 集成服务器的出站适配器