java.lang.NullPointerException: intento de invocar el método virtual 'int android.view.View.getImportantForAccessibility ()' en una referencia de objeto nulo

154

Estoy tratando de armar una aplicación de lista de compras, basada en campos de entrada ArrayList, y ListView. La aplicación se basará en Fragments. Sin embargo, he encontrado un problema y no sé cómo solucionarlo.

Miré a mi alrededor en Google y StackOverflow y encontré algo de información. Sin embargo, no lo tengo para trabajar. Ahora espero poder obtener ayuda con mi código.

Soy relativamente inexperto en el desarrollo de Android.

Main.java

import java.util.ArrayList;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;

public class Main extends FragmentActivity {
    
    ArrayList<Detail> items = new ArrayList<Detail>();
    FragmentManager FM;
    FragmentTransaction FT;
    Input input = new Input();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        replaceFragment(R.id.container, input);
    }

    
    public void replaceFragment(int container, Fragment fragment){
        FM = getFragmentManager();
        FT = FM.beginTransaction();
        
        FT.replace(container, fragment);
        FT.commit();
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

ListAdapter.java

public class ListAdapter extends BaseAdapter {

    Context context;
    ArrayList<Detail> items;
    
    public ListAdapter(Context context, ArrayList<Detail> items) {
        this.context = context;
        this.items = items;
    }
    
    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return items.indexOf(getItem(position));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        if(convertView == null){
            LayoutInflater lInflater = (LayoutInflater)context.getSystemService(
                    Activity.LAYOUT_INFLATER_SERVICE);
            
            convertView = lInflater.inflate(R.layout.list_row, null);       
        }
        
        TextView title = (TextView)convertView.findViewById(R.id.itemTitle);
        CheckBox done = (CheckBox)convertView.findViewById(R.id.itemDone);
        
        
        Detail detail_position = items.get(position);
        
        title.setText(detail_position.getTitle());
        done.setChecked(detail_position.isDone());
        
        return null;
    }
}

List.java

import java.util.ArrayList;

import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

public class List extends ListFragment implements OnItemClickListener{

    ArrayList<Detail> items;
    ListAdapter adapter;
    private onClickListener OCL;

    interface onClickListener{
        public void onItemClick(int id);
    }

    public List(ArrayList<Detail> items) {
        this.items = items;
    }

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

        View root = inflater.inflate(R.layout.list_layout, container, false);
        return root;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if(items != null){
            adapter = new ListAdapter(getActivity(), items);
            setListAdapter(adapter);
            getListView().setOnItemClickListener(this);
        }

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        if(OCL != null){
            OCL.onItemClick(position);
        }       
    }
}

list_layout.xml

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

list_row

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="10dp" >
    <TextView
        android:id="@+id/itemTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.96"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    <CheckBox
        android:id="@+id/itemDone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Done" />
</LinearLayout>

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.com.hermods.lab2_2.Main" >
</RelativeLayout>

Iniciar sesión

02-19 09:10:47.421: E/AndroidRuntime(12745): Process: com.example.com.hermods.lab2_2, PID: 12745
02-19 09:10:47.421: E/AndroidRuntime(12745): java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.AbsListView.obtainView(AbsListView.java:2360)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.ListView.makeAndAddView(ListView.java:1864)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.ListView.fillDown(ListView.java:698)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.ListView.fillFromTop(ListView.java:759)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.ListView.layoutChildren(ListView.java:1673)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.AbsListView.onLayout(AbsListView.java:2148)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.View.layout(View.java:15596)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewGroup.layout(ViewGroup.java:4966)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.Choreographer.doFrame(Choreographer.java:550)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.os.Handler.handleCallback(Handler.java:739)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.os.Looper.loop(Looper.java:135)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at java.lang.reflect.Method.invoke(Native Method)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at java.lang.reflect.Method.invoke(Method.java:372)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-19 09:10:47.421: E/AndroidRuntime(12745):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
usuario2734182
fuente
1
¿Sabes que return items.indexOf(getItem(position));es igual a positionen tu caso? Lo primero que debe probar es eliminar el constructor de List.
Blackbelt

Respuestas:

397

En su public View getViewmétodo, cambie return null;a return convertView;.

Pavya
fuente
@ user2734182 ¿puede extender su respuesta y explicar por qué convertViewsería alguna vez null, tiene un significado especial?
dark_ruby
66
@dark_ruby: getView () de un adaptador requerido para devolver a View. Si regresa null, recibirá el mismo mensaje de error exacto.
ariefbayu
14

#utilizar return convertView;

Código:

public View getView(final int position, View convertView, ViewGroup parent) {

    //convertView = null;

    if (convertView == null) {

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.list_item, null);     

        TextView tv = (TextView) convertView.findViewById(R.id.name);
        Button rm_btn = (Button) convertView.findViewById(R.id.rm_btn);

        Model m = modelList.get(position);
        tv.setText(m.getName());

        // click listener for remove button  คลิกลบปุ่ม
        rm_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                modelList.remove(position);
                notifyDataSetChanged();
            }
        });
    }

    ///#use    return convertView;
    return convertView;
}
Pong Petrung
fuente
2

en su constructor de clase baseadapter intente inicializar LayoutInflater , normalmente prefiero de esta manera,

public ClassBaseAdapter(Context context,ArrayList<Integer> listLoanAmount) {
    this.context = context;
    this.listLoanAmount = listLoanAmount;
    this.layoutInflater = LayoutInflater.from(context);
}

en la parte superior de la clase crea la variable LayoutInflater , espero que esto te ayude

Ashana.Jackol
fuente
1

a veces ocurre cuando usamos un adaptador personalizado en cualquier actividad de fragmento. y devolvemos un objeto nulo, es decir, una vista nula, por lo que la actividad se confunde con qué vista cargar, por eso se produce esta excepción

muestra la posición donde cambiar la vista

Aakib Jabbar
fuente