El getview de adaptador personalizado lanza NullPointerException cuando las variables no son nulas
Estoy intentando fijar el adaptador de encargo para exhibir mensajes al usuario usando la aplicación de la charla de la demostración en la visión de la lista, pero recibiendo errores en el método de getView de mi adaptador de la lista de encargo.
- Hice doble verificación en mis pasos y la depuración para averiguar si titular no es nulo. Pero titular no es nulo como se puede ver en mi salida de variable de depurador.
El error está en línea:
- Fragmentos múltiples con diferentes listas de expansión para los mismos datos
- Cómo comprobar si un Array contiene un término específico - Android
- ArrayList que agrega artículos nulos automáticamente
- Cómo establecer el tamaño de dibujo en la lista de capas
- HashMap con clave de matriz de bytes y valor de cadena - la función containsKey () no funciona
holder.message.setText("lol");
¿Cuál podría ser el posible error en mi getView () de adaptador personalizado? Gracias por cualquier sugerencia y ayuda de antemano.
Mi adaptador personalizado:
import java.util.ArrayList; import android.content.Context; import android.support.v4.view.ViewPager.LayoutParams; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ChattingAdapter extends BaseAdapter{ private Context mContext; private ArrayList<ChatMessage> mMessages; public ChattingAdapter(Context context, ArrayList<ChatMessage> messages) { super(); this.mContext = context; this.mMessages = messages; } @Override public int getCount() { return mMessages.size(); } @Override public Object getItem(int position) { return mMessages.get(position); } @Override public View getView(int position, View convertView, ViewGroup parent) { ChatMessage message = (ChatMessage) this.getItem(position); ViewHolder holder; if(convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.listener, parent, false); holder.message = (TextView) convertView.findViewById(R.id.text1); convertView.setTag(holder); } else holder = (ViewHolder) convertView.getTag(); Log.wtf("message", message.getMessage()); //holder.message.setText(message.getMessage()); holder.message.setText("lol"); LayoutParams lp = (LayoutParams) holder.message.getLayoutParams(); //Check whether message is mine to show green background and align to right if(message.isMine()) { holder.message.setBackgroundResource(R.drawable.speech_bubble_green); lp.gravity = Gravity.RIGHT; } //If not mine then it is from sender to show orange background and align to left else { holder.message.setBackgroundResource(R.drawable.speech_bubble_orange); lp.gravity = Gravity.LEFT; } holder.message.setLayoutParams(lp); //holder.message.setTextColor(R.color.textColor); return convertView; } private static class ViewHolder { TextView message; } @Override public long getItemId(int position) { //Unimplemented, because we aren't using Sqlite. return position; } }
Mis resultados del depurador para las variables:
holder ChattingAdapter$ViewHolder (id=830019560368) this ChattingAdapter (id=830019493992) message ChatMessage (id=830019492960) position 0 convertView LinearLayout (id=830019561504) parent ListView (id=830018556296)
Mis diseños Xml: listitem.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text1" android:background="@drawable/speech_bubble_green" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="false" android:textStyle="bold" />
Listener.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="10dip" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="0px" android:layout_weight="1" android:transcriptMode="normal" android:stackFromBottom="true" android:fadingEdge="none" android:padding="4dp" android:fastScrollEnabled="true" android:smoothScrollbar="false" android:focusable="true"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:padding="4dp"> <EditText android:id="@+id/chat_input" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="1" android:maxLines="5" android:inputType="textShortMessage|textAutoCorrect|textMultiLine|textCapSentences" android:imeOptions="actionSend|flagNoExtractUi" android:cursorVisible="true" android:hint="Enter message" /> <Button android:id="@+id/chat_send_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="send" /> </LinearLayout> </LinearLayout>
Mi rastreo de la pila:
02-21 16:48:36.008: E/Trace(18696): error opening trace file: No such file or directory (2) 02-21 16:49:00.008: A/Service(18696): connected 02-21 16:52:07.508: A/message(18696): Hello 02-21 16:52:26.018: E/AndroidRuntime(18696): FATAL EXCEPTION: main 02-21 16:52:26.018: E/AndroidRuntime(18696): java.lang.NullPointerException 02-21 16:52:26.018: E/AndroidRuntime(18696): at com.example.konnect.ChattingAdapter.getView(ChattingAdapter.java:49) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.AbsListView.obtainView(AbsListView.java:2273) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.ListView.makeAndAddView(ListView.java:1769) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.ListView.fillUp(ListView.java:706) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.ListView.layoutChildren(ListView.java:1626) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.AbsListView.onLayout(AbsListView.java:2108) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.View.layout(View.java:13754) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewGroup.layout(ViewGroup.java:4364) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.View.layout(View.java:13754) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewGroup.layout(ViewGroup.java:4364) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.View.layout(View.java:13754) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewGroup.layout(ViewGroup.java:4364) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.View.layout(View.java:13754) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewGroup.layout(ViewGroup.java:4364) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.View.layout(View.java:13754) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewGroup.layout(ViewGroup.java:4364) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.Choreographer.doFrame(Choreographer.java:525) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.os.Handler.handleCallback(Handler.java:615) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.os.Handler.dispatchMessage(Handler.java:92) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.os.Looper.loop(Looper.java:137) 02-21 16:52:26.018: E/AndroidRuntime(18696): at android.app.ActivityThread.main(ActivityThread.java:4931) 02-21 16:52:26.018: E/AndroidRuntime(18696): at java.lang.reflect.Method.invokeNative(Native Method) 02-21 16:52:26.018: E/AndroidRuntime(18696): at java.lang.reflect.Method.invoke(Method.java:511) 02-21 16:52:26.018: E/AndroidRuntime(18696): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 02-21 16:52:26.018: E/AndroidRuntime(18696): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 02-21 16:52:26.018: E/AndroidRuntime(18696): at dalvik.system.NativeStart.main(Native Method) 02-21 16:52:31.008: E/Trace(18898): error opening trace file: No such file or directory (2)
Función que llama el adaptador de encargo en la adición de nuevos mensajes:
ArrayList<ChatMessage> messagex= new ArrayList<ChatMessage>();; ChattingAdapter adaptex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listener); messagex.add(new ChatMessage("Hello", false)); adaptex = new ChattingAdapter(getApplicationContext(),messagex); setListAdapter(adaptex); Button send_button = (Button) findViewById(R.id.chat_send_message); sender_message = (EditText) findViewById(R.id.chat_input); send_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { msg = sender_message.getText().toString(); if(!(msg.length()==0)){ messagex.add(new ChatMessage(msg, true)); //addNewMessage(new ChatMessage(msg, true)); adaptex.notifyDataSetChanged(); getListView().setSelection(messagex.size()-1); } }});
Clase ChatMessage:
public class ChatMessage { String message; /** * boolean to determine, who is sender of this message */ boolean isMine; // boolean isStatusMessage; /** * Constructor to make a Message object */ public ChatMessage(String message, boolean isMine) { super(); this.message = message; this.isMine = isMine; // this.isStatusMessage = false; } /** * Constructor to make a status Message object * consider the parameters are swaped from default Message constructor, * not a good approach but have to go with it. */ public ChatMessage(boolean status, String message) { super(); this.message = message; this.isMine = false; //this.isStatusMessage = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public boolean isMine() { return isMine; } public void setMine(boolean isMine) { this.isMine = isMine; } /** public boolean isStatusMessage() { return isStatusMessage; } public void setStatusMessage(boolean isStatusMessage) { this.isStatusMessage = isStatusMessage; } */ }
- Subclasificación de SimpleCursorAdapter para incluir convertView para la conservación de la memoria
- Realizar bucle en la lista android
- Desplazamiento por Android en la lista
- Cómo obtener lista de sms como convesations en cada dispositivo Android 2.2+
- Ordenar una lista basada en otra lista
- ¿Cómo obtener archivos de la carpeta raw a listview?
- ¿Cómo comprobar todos los servicios en ejecución en android?
- Reordenación de listas como listas de reproducción en el reproductor multimedia
Tienes
convertView = LayoutInflater.from(mContext).inflate(R.layout.listener, parent, false);
y entonces
holder.message = (TextView) convertView.findViewById(R.id.text1);
Pero tienes textview con id text1 en listitem.xml
no listener.xml
que inflas.
listitem.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text1"
Por lo tanto, la inicialización falla
holder.message = (TextView) convertView.findViewById(R.id.text1);
Por lo tanto NullPointerException
@
holder.message.setText("lol");
Solución: Cambie a
convertView = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
Cambio :
convertView = LayoutInflater.from(mContext).inflate(R.layout.listener, parent, false);
a :
convertView = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
- RecyclerView.Adapter.notifyItemMoved (0,1) desplaza la pantalla
- Animación de Android dejando artefactos