1

У меня есть пользовательский Adapter и в его методе getView(), я пытаюсь запустить диалог предупреждения, когда пользователь нажимает Button, но я получаю сообщение об ошибке. Я надеюсь, что кто-то может помочь мне здесьЗапуск DialogFragment в getView пользовательского адаптера

Вот мой заказ адаптер:

package com.example.android.testappsfeatures; 

import android.content.Context; 
import android.graphics.Color; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.text.NumberFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 


/** 
* Created by korchix on 05.02.17. 
*/ 

public class UserAdapter extends ArrayAdapter<UserCard> { 

    Context context = getContext().getApplicationContext();  

    public UserAdapter(Context context, ArrayList<UserCard> userCards) { 
     super(context, 0, userCards); 
    } 


    // override getView because where are using other view than just TV alone. 
    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     // get the data item for this position 
     final UserCard newUser = getItem(position); 
     final ViewHolder holder = new ViewHolder(); 
     // check if an existing view is being reused, otherwise inflate the view 
     if(convertView == null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.user_layout, parent, false); 
     } 

     View userCardbackgroundColor = convertView.findViewById(R.id.userCard); 
     userCardbackgroundColor.setBackgroundColor(Color.WHITE); 


     // Lookup view for data population 
     holder.userNameTV = (TextView) convertView.findViewById(R.id.name_textView); 
     holder.userNameTV.setText(newUser.getUserName()); 

     holder.gutHabenTV = (TextView) convertView.findViewById(R.id.guthaben_textView); 
     holder.gutHabenTV.setText(NumberFormat.getCurrencyInstance().format(Double.parseDouble(newUser.getGuthaben()))); 

     holder.timeStampTV = (TextView) convertView.findViewById(R.id.datumUhrzeit_textVie); 
     holder.timeStampTV.setText(newUser.getTimeStamp()); 

     holder.plusButton = (Button) convertView.findViewById(R.id.plusButton_Layout); 
     holder.plusButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

     **// HERE IS THE PROBLEM** 
       FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
       AddBalanceDialog addBalanceDialog = new AddBalanceDialog(); 
       fragmentTransaction.replace(R.id.containerLayoutID, addBalanceDialog); 
       fragmentTransaction.commit(); 

      } 
     }); 
     return convertView; 
    } 
} 



class ViewHolder { 
    TextView userNameTV; 
    TextView gutHabenTV; 
    TextView timeStampTV; 
    Button plusButton; 
    Button minusButton; 
} 

И это код AlertDialog (DialogFragment)

package com.example.android.testappsfeatures; 

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

/** 
* Created by korchix on 04.02.17. 
*/ 

public class AddBalanceDialog extends DialogFragment { 
    Context context; 
    InputUserDataDialog inputUserDataDialog = new InputUserDataDialog(); 




    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     context = getActivity().getApplicationContext(); 
     //user Dialog class for convenient dialog construction 
     AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); 
     // get the layoutInflater 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     // inflate our custom Layout for the dialog to a View 
     View view = inflater.inflate(R.layout.add_guthaben, null); 

     final TextView guthabenTV = (TextView) view.findViewById(R.id.guthaben_textView); 

     final EditText addGuthabenET = (EditText) view.findViewById(R.id.add_guthaben_LayoutET); 

     // inform the dialog it has a custom View 
     dialog.setView(view); 

     // when positiv button clicked 
     dialog.setPositiveButton(R.string.dialog_ok_buttom, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       String input = addGuthabenET.getText().toString(); 

       guthabenTV.setText(input); 


       // hier muss noch was 
       // gemacht werden 
      } 
     }) 
       .setNegativeButton(R.string.dialog_cancel_button, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // discard the input -> don't make any change 
         dialog.cancel(); 

        } 
       }); 

     return dialog.create(); 
    } 

} 

Я получил эту ошибку, когда я нажал на plusButton.setOnClickListener(new View.OnClickListener()

E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.example.android.testappsfeatures, PID: 30548 
java.lang.ClassCastException: android.app.Application cannot be cast to android.support.v7.app.AppCompatActivity 
at com.example.android.testappsfeatures.UserAdapter$1.onClick(UserAdapter.java:83) 
at android.view.View.performClick(View.java:4756) 
at android.view.View$PerformClick.run(View.java:19749) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Как я прочитал здесь, кажется что проблема связана с контекстом, я даю Application Context, но я должен дать Activity context. Я не знаю, как это сделать.

Вот мой AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.testappsfeatures"> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".InputGuthabenActivity" 
      android:label="@string/addGuthabenTitle" 
      android:theme="@style/Theme.AppCompat.Light.Dialog.Alert" /> 
    </application> 

</manifest> 
+0

просто удалить 'getApplicationContext()' бит –

+0

@Mehmet я удалил getApplicationContext(), но я получаю ту же ошибку: java.lang.ClassCastException: android.app.Application не может быть cast to android.support.v7.app.AppCompatActivity в контексте FragmentManager fm = ((AppCompatActivity)) .getSupportFragmentManager(); – korchix

+0

Вино это указывает? –

ответ

0

Вы передаете контекст приложения, и вы пытаетесь бросить его обратно в FragmentActivity, который является неправильным. Вы также можете напрямую передать ссылку на мероприятие.

Изменить

context = getActivity().getApplicationContext(); 

в

context = getActivity(); 
+0

нет, я не могу, когда это контекст контекста = getActivity(); Я получаю сообщение об ошибке: Не могу решить Methode 'getActivity()' – korchix

+1

@korchix Вы уже используете его. Как это невозможно решить? –

+0

okok :) я удален getApplicationContext() , но я получить тот же ERRO: java.lang.ClassCastException: android.app.Application не может быть приведен к android.support.v7.app.AppCompatActivity на FragmentManager FM = ((AppCompatActivity) .getSupportFragmentManager(); – korchix

0

В конструкторе адаптера, есть параметр context. Объявите это как field с this.context = context;. Затем используйте этот контекст, когда вам нужен контекст в вашем адаптере.

+0

Я сделал это: 'public class UserAdapter extends ArrayAdapter { Контекст mContext; public UserAdapter (контекст контекста, ArrayList userCards) { super (context, 0, userCards); this.mContext = context; } '} но у меня такая же ошибка: java.lang.ClassCastException: android.app.Application не может быть добавлено в android.support.v7.app.AppCompatActivity – korchix

+0

Вы изменили остальную часть своего кода? «Затем используйте этот контекст, когда вам нужен контекст в вашем адаптере». Я также подразумеваю, что вы не должны бросать его ничего –

+0

Возможно, вам стоит прочитать http://stackoverflow.com/questions/3572463/what-is-context-on-android, http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext и http://stackoverflow.com/questions/6229052/difference-in-context-this-and-getcontext –

0

ОК окончательно я решил это !!! для людей, которые заинтересованы в ответ, вот как я это сделал:

в MainActivity.class, где я создать экземпляр ArrayAdapter, я изменил контекст от getApplicationContext к this как этот

UserAdapter userAdapter = new UserAdapter(this, arrayOfUsersNames, fm); 

и я добавил FragmentManager в конструкторе моего UserAdapter как этот

public class UserAdapter extends ArrayAdapter<UserCard>{ 
    Context mContext; 
    AddBalanceDialog addBalanceDialog = new AddBalanceDialog(); 
    FragmentManager mFragmentManager; 

    public UserAdapter(Context context, ArrayList<UserCard> userCards, FragmentManager fragmentManager) { 

     super(context, 0, userCards); 
     mContext = context; 
     mFragmentManager = fragmentManager; 
    } 

затем в OnClick(), где щелкнули кнопку, я добавил эту строку кода, чтобы показать оповещения Dialog 'addBalanceDialog.show(mFragmentManager, "test"); ' и она работала :)

Смежные вопросы