Открытие диалогового окна внутри адаптера, возвращающего нулевые значения - PullRequest
0 голосов
/ 11 ноября 2019

Я пытался заставить это работать безуспешно уже около 10 часов, я просмотрел переполнение стека. Я пытаюсь отобразить простое диалоговое окно и обработать несколько простых вводов.

В качестве заголовка у него TextView , EditText В качестве поля ввода и две кнопки продолжить операцию или отменить.

По какой-то причине, независимо от того, что я делаю, я не могу ссылаться на ЛЮБОЕ представление внутри моего XML-макета shopping_dialogue. Это дает мне эту ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.TextView.setText (java.lang.CharSequence)' для ссылки на пустой объект

Я попытался добавить событие onClick к кнопке, чтобы посмотреть, работает ли это, когда я пытаюсь сослаться на кнопку внутри метода onClick, это выдает мне ту же ошибку. Для этого я использую фрагмент.

shopping_dialog.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/shoppingDialogTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="Edit Shopping List Name" />

<EditText
    android:id="@+id/shoppingDialogEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="30"
    android:inputType="textPersonName"
     />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <Button
        android:id="@+id/shoppingDialogOk"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />

    <Button
        android:id="@+id/shoppingDialogCancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="k"
        android:text="Button" />
</LinearLayout>

shopping_list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
card_view:cardCornerRadius="4dp"
android:id="@+id/shoppingList_card_view"
android:layout_margin="10dp"
android:layout_height="200dp">
<LinearLayout
    android:id="@+id/shoppingListParent"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:gravity="center"

    android:layout_height="match_parent">
    <TextView
        android:id="@+id/shoppingName"
        android:layout_width="wrap_content"
        android:gravity="center"
        android:textSize="25sp"
        android:textColor="#FFF"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/shoppingDate"
        android:layout_width="wrap_content"
        android:gravity="center"
        android:textSize="25sp"
        android:textColor="#FFF"
        android:layout_height="wrap_content" />
</LinearLayout>
</androidx.cardview.widget.CardView>

frag_shopping_list.xml

  <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">

 <androidx.recyclerview.widget.RecyclerView
    android:id="@+id/shoppingList_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
 </LinearLayout>

ShopingAdapter.java

public class ShoppingAdapter extends RecyclerView.Adapter<ShoppingAdapter.ShoppingViewHolder> {

private List<ShoppingData> shoppingList;
private Context context;

public ShoppingAdapter(List<ShoppingData> shoppingList, Context context){
    this.shoppingList = shoppingList;
    this.context = context;

}

@NonNull
@Override
public  ShoppingViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i){
    View itemView = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.shopping_list_row, viewGroup, false);
    return new ShoppingViewHolder(itemView);
}

@Override
public void onBindViewHolder(ShoppingViewHolder viewHolder, int i){
    ShoppingData data = shoppingList.get(i);
    Random k = new Random();
    int color = Color.argb(255,k.nextInt(255),k.nextInt(255),k.nextInt(255));
    viewHolder.parent.setBackgroundColor(color);
    viewHolder.shoppingName.setText(data.getName());
    viewHolder.shoppingDate.setText(data.getDate());

    viewHolder.shoppingName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        AlertDialog.Builder builder1 = new AlertDialog.Builder(v.getContext());
            builder1.setCancelable(true);

            builder1.setView(R.layout.shopping_dialog);
            AlertDialog alert = builder1.create();

            /*
            EditText text = v.findViewById(R.id.shoppingDialogEditText);
            text.setText("Some Text");

            This causes a null object reference

             */
            alert.show();


        }
    });


}

@Override
public int getItemCount(){return shoppingList.size();}

public class ShoppingViewHolder extends RecyclerView.ViewHolder{
    private TextView shoppingName, shoppingDate;
    private LinearLayout parent;


    public ShoppingViewHolder(View itemView){
        super(itemView);
        parent = itemView.findViewById(R.id.shoppingListParent);
        shoppingName = itemView.findViewById(R.id.shoppingName);
        shoppingDate = itemView.findViewById(R.id.shoppingDate);

    }


}

}

ShoppingFragment.java

public class ShoppingFragment extends Fragment {

private RecyclerView recyclerView;
private ShoppingAdapter shoppingAdapter;
private List<ShoppingData> shoppingList = new ArrayList<>();

@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState){

    shoppingList.add(new ShoppingData("k","12/12/12"));
    shoppingList.add(new ShoppingData("k","12/12/12"));
    shoppingList.add(new ShoppingData("k","12/12/12"));
    shoppingList.add(new ShoppingData("k","12/12/12"));
    shoppingList.add(new ShoppingData("k","12/12/12"));
    shoppingList.add(new ShoppingData("k","12/12/12"));

    View rootView = inflater.inflate(R.layout.fragment_shopping_list, container, false);

    recyclerView = rootView.findViewById(R.id.shoppingList_recycler_view);
    shoppingAdapter = new ShoppingAdapter(shoppingList, getActivity());
    RecyclerView.LayoutManager manager = new GridLayoutManager(getActivity(), 2);
    recyclerView.setLayoutManager(manager);
    recyclerView.setAdapter(shoppingAdapter);

    return rootView;
}


public void k(View view){ //the click listern that causes a null object reference when referencing the button
    Button button = view.findViewById(R.id.shoppingDialogOk);
    button.setText("k");
}



}

ShoppingData.java

package com.uhcl.recipe5nd.helperClasses;

public class ShoppingData {
   private String name;
   private String date;

public ShoppingData(String name, String date){
    this.name = name;
    this.date = date;
}

public String getDate(){
    return this.date;
}

public String getName(){
    return this.name;
}

}

Все работает нормально, пока я не попытаюсь сослаться на что-нибудь внутри shopping_dialog.xml .

Если вы посмотрите на мои покупкикласс адаптера , что я пытаюсь сделать, это добавить прослушиватель onClick к текстовому представлению «shoppigName» внутри моего метода onBindViewHolder. Это работает, но когда я пытаюсь сослаться на shoppingDialogEditText , приложение вызывает сбой и выдает мне эту ошибку.

Как я уже упоминал, я также попытался добавить метод события нажатия k к кнопке внутри shopping_dialog.xml и реализовал его внутри моего класса фрагмента, чтобы посмотреть, будет ли этоработать, но это все равно вызывает ту же ошибку.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019
viewHolder.shoppingName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

View dailogView =  LayoutInflater.from(mContext).inflate(R.layout.shopping_dialog, null);

        AlertDialog.Builder builder1 = new AlertDialog.Builder(v.getContext());
            builder1.setCancelable(true);

            builder1.setView(dailogView);
            AlertDialog alert = builder1.create();

            EditText text = dailogView.findViewById(R.id.shoppingDialogEditText);
            text.setText("Some Text");


            alert.show();


        }
    });

Представление, которое вы используете для поиска edittext, не является представлением этого диалогового окна, поэтому оно выдает нулевой указатель.

0 голосов
/ 11 ноября 2019

Вы используете неправильное представление, чтобы найти editText. Это не вид диалогового окна. Это вид элемента, по которому щелкают, а не диалоговое окно. Используйте это

viewHolder.shoppingName.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    View dailogView =  
        LayoutInflater.from(mContext).inflate(R.layout.shopping_dialog, null);

        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
        builder.setCancelable(true);

        builder.setView(dailogView);
        AlertDialog alert = builder.create();

        EditText text = dailogView.findViewById(R.id.shoppingDialogEditText);
        text.setText("Shopping Dialog Text");


        alert.show();


    }
});

}

...