C’est la première fois que je travaille avec Recyclerview et j’obtiens quelques erreurs au sujet de Android:onClick="addItem"
. Voici ce que j’obtiens lorsque je tente d’ajouter une ligne de texte à mon aperçu Recycl. J'utilise généralement mon téléphone pour tester mes applications.
Java.lang.IllegalStateException: Could not execute method of the activity
at Android.view.View$1.onClick(View.Java:4012)
at Android.view.View.performClick(View.Java:4761)
at Android.view.View$PerformClick.run(View.Java:19767)
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:5312)
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:901)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)
Caused by: Java.lang.reflect.InvocationTargetException
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at Android.view.View$1.onClick(View.Java:4007)
at Android.view.View.performClick(View.Java:4761)
at Android.view.View$PerformClick.run(View.Java:19767)
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:5312)
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:901)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)
Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.text.Editable Android.widget.EditText.getText()' on a null object reference
at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.Java:53)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at Android.view.View$1.onClick(View.Java:4007)
at Android.view.View.performClick(View.Java:4761)
at Android.view.View$PerformClick.run(View.Java:19767)
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:5312)
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:901)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)
Voici mon code où je pense que c'est l'erreur, mais je ne sais pas exactement:
public class MainActivity extends ActionBarActivity {
private EditText mText;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView recyclerView;
private Button btn;
private CustomRecyclerAdapter mAdapter;
private List<Data> mData = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initializing views.
mText = (EditText) findViewById(R.id.textEt);
recyclerView = (RecyclerView) findViewById(R.id.recycler);
// If the size of views will not change as the data changes.
recyclerView.setHasFixedSize(true);
// Setting the LayoutManager.
mLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(mLayoutManager);
// Setting the adapter.
CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter);
}
// Called when add button is clicked.
public void addItem(View v) {
if(mText!=null) {
Data dataToAdd = new Data(mText.getText().toString()); mData.add(dataToAdd);
}
}
}
Et voici mon adaptateur recyclerview à savoir avec certitude:
public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
CustomRecyclerAdapter mAdapter;
private List<Data> mData = Collections.emptyList();
public CustomRecyclerAdapter() {
// Pass context or other static stuff that will be needed.
}
public void updateList(List<Data> data) {
mData = data;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mData.size();
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);
return new RecyclerViewHolder(itemView);
}
@Override
public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) {
viewHolder.title.setText(mData.get(position).text);
}
public void addItemInRec(int position, Data data) {
mData.add(data);
notifyItemInserted(position);
}
public void removeItem(int position) {
mData.remove(position);
notifyItemRemoved(position);
}
}
Mon fichier xml MainActivity:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
Android:orientation="horizontal"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<EditText
Android:id="@+id/textEt"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:hint="Text"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Add"
Android:onClick="addItem"/>
</LinearLayout>
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:scrollbars="vertical"/>
</LinearLayout>
Peut-être que c'est mon ViewHolder:
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public RecyclerViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
}
}
Ou classe Data.Java:
public class Data {
public String text;
public Data(String text) {
this.text = text;
}
}
Vous obtenez un pointeur null sur l'appel getText()
Cela signifie la ligne suivante:
EditText mText = (EditText) findViewById(R.id.textEt);
renvoie null, la solution consiste à vérifier et à corriger la mise en page de sorte que textEt
y figure.
Modifier:
Si vous êtes sûr que c'est dans la mise en page, supprimez la déclaration EditText
.
Déclarer en tant que private EditText mText;
sur la portée de la classe
setContentView(R.layout.name_of_layout_here);
mText = (EditText) findViewById(R.id.textEt);
La clé est dans votre message d'erreur:
Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.text.Editable Android.widget.EditText.getText()' on a null object reference
at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.Java:53)
Une bonne astuce pour apprendre de votre sortie d'erreur consiste à examiner chaque déclaration "Caused by" (Causé par) et à parcourir le journal jusqu'à ce que vous trouviez l'un de vos propres fichiers référencé. Ensuite, cette partie du journal des erreurs vous indiquera même la ligne sur laquelle votre code a échoué (dans ce cas, il s’agit de la ligne 53 sur MainActivity.Java).
Une exception de pointeur nul en Java survient lorsque vous essayez d'appeler une méthode sur un objet 'A', mais que cet objet 'A' est actuellement null
.
Donc, ce message d'erreur signifie: "Sur la ligne 53 de MainActivity.Java, vous avez essayé d'appeler une méthode sur un objet qui n'existe pas encore, alors je suis tombé en panne."
La méthode qui échoue est EditText mText = (EditText) findViewById(R.id.textEt);
Généralement, ce type d'échec signifie que vous ne trouvez pas le bon identifiant dans votre mise en page. Vérifiez à nouveau que textEt
est l'ID correct pour cet élément de présentation.
MODIFIER:
Vous ne savez toujours pas pourquoi vos opinions ne sont pas renseignées, mais j'ai remarqué une erreur avec votre adaptateur. Vous redéfinissez mAdapter
, vous avez donc 2 copies, une de portée locale et une en tant que membre de MainActivity. Cela va définitivement gâcher les choses.
Ici:
// Setting the adapter.
CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)
Vous redéfinissez mAdapter
localement. Faites ceci à la place:
// Setting the adapter.
mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)
La vue dans addItem(View v)
fait référence au bouton uniquement . L'objet EditText
que vous souhaitez ne figure pas dans le bouton, il se trouve dans la vue parent du bouton . Si vous essayez d'accéder à l'objet à partir de la vue du bouton, il être null, car le bouton ne l’a pas .. .. Au lieu de cela, vous devez accéder à l’objet à partir de la vue parent du bouton.
// Solution:
public void addItem(View v) {
View parentView = (View) v.getParent();
EditText mText = (EditText) parentView.findViewById(R.id.textEt);
Log.d("LOG", mText.getText().toString()));
}
Je sais que techniquement, cela ne résout pas le code de la question. Mais le code dans la question a été modifié par rapport à ce qui a provoqué l'erreur, ce qui résoudrait le code de buggy d'origine qui a effectivement généré la question . Je suppose que le code de buggy d'origine ressemblait à ceci:
// My guess this was the original buggy code
// MainActivity.Java
public void addItem(View v) {
EditText mText = (EditText) v.findViewById(R.id.textEt);
Data dataToAdd = new Data(mText.getText().toString());
mData.add(dataToAdd);
}
// MainActivity.xml
<LinearLayout>
<EditText
Android:id="@+id/textEt"
/>
<Button
Android:text="Add"
Android:onClick="addItem"/>
</LinearLayout>