Как получить AdapterPositions, не получая нулевое значение в адаптере OnClick на держателе представления? - PullRequest
0 голосов
/ 05 февраля 2019

Мне нравится получать позиции, я пытаюсь использовать простой тост, и я получил его, но когда я пытаюсь использовать его для интерфейса, я получаю ошибку

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();
}
}

ListAdapter открытый класс 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);
}


}

и в основном, когда я пытаюсь получитьAdAdterPositions, ошибка, которую я получил, выглядит следующим образом.

Ошибка

 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)

как мне получить позиции Адаптера?что-то не так с моим интерфейсом?

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема в том, что ваш 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; внутри конструктора.

Таким образом, вы просто передаете прослушиватель, но никогда не сохраняете его ... поэтому onClickListenerAdapterList объекта ListAdapter на самом деле все еще равен нулю.

Поэтому, когда вы передаете этот onClickListenerAdapterList своим ViewHolders, вы фактически передаете onClickListenerAdapterList, который по-прежнему равен нулю.

Итак, чтобы исправить ошибку, просто измените конструктор на:

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