Проблема с отображением DialogFragment с кнопки в адаптере Android - PullRequest
0 голосов
/ 29 апреля 2020

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

java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity
        at com.example.karate_manager.Adapters.AdapterMarket$1.onClick(AdapterMarket.java:106)

Это мой адаптер:

public class AdapterMarket extends ArrayAdapter{
private FragmentManager fm;
    Context context;
    int item_Layaut;
    ArrayList<Karateka> data;
    ApiUtils apiUtils;

  public AdapterMarket(@NonNull Context context, int resource, @NonNull ArrayList objects, FragmentManager fm) {
        super(context, resource, objects);
        this.context = context;
        this.item_Layaut = resource;
        this.data = objects;
        this.fm = fm;
    }

    public void setData(MarketResponse data) {
        if(data!=null){
            this.data = data.getKaratekas();
            this.notifyDataSetChanged();
        }
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            convertView = layoutInflater.inflate(item_Layaut, parent, false);
        }

        String value = String.valueOf(data.get(position).getValue());
        Button buttonValue = convertView.findViewById(R.id.item_button_value_karateka);
        buttonValue.setText(value);

        popupBidKarateka(buttonValue);

        return convertView;
    }

    public void popupBidKarateka(Button buttonValue){
        buttonValue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentActivity activity = (FragmentActivity)(context);
                fm = activity.getSupportFragmentManager();
                DialogFragment newFragment = new BidKaratekaDialogFragment();
                newFragment.show(fm, "bid" );
            }
        });
    }
}

А это ссылка во Фрагменте:

     FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        adapterMarket = new AdapterMarket(getActivity().getApplicationContext(), R.layout.item_market_layout, marketResponse.getKaratekas(), fragmentManager);

1 Ответ

0 голосов
/ 29 апреля 2020
               public void onClick(View view) {
                Application activity1 = (Application) view.getContext(); // bad

                FragmentActivity activity = (FragmentActivity)(context); // context must come from FragmentActivity

// Я предположил, что FragmentActivity - это класс, из которого вы вызываете адаптер.

                FragmentManager fm = activity.getSupportFragmentManager();
                DialogFragment newFragment = new BidKaratekaDialogFragment();
                newFragment.show(fm, "bid" );
            }
        });

Мудрец сказал ..

Контекст не всегда активность, даже когда вы в деятельности. Это может быть приложение или оболочка другого контекста. Почти всегда неправильно приводить контекст к действию. Если он вам абсолютно необходим, вы должны передать Activity как параметр, а не Context. Или, что еще лучше, передайте менеджер поддержки напрямую, а не действие, поскольку это все, что вам нужно.

public AdapterMarket(@NonNull Context context, FragmentManager fm, int resource, @NonNull ArrayList objects) {
        super(context, resource, objects);
        this.context = context;
        this.fm = fm;
        this.item_Layaut = resource;
        this.data = objects;
    }

// скажем, Afragment вызывает адаптер.

AFragment.class
FM fm = getActivity.getSupportFM/getFM();
AdapterMarket market = new AdapterMarket(someContext, fm, ....) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...