2015-02-19 20 views
111

Sto provando a mettere insieme un'app lista della spesa, in base ai campi di input, ArrayList, e ListView. L'app sarà basata su Fragments. Tuttavia, ho riscontrato un problema e non so come risolverlo.java.lang.NullPointerException: tentativo di invocare il metodo virtuale 'int android.view.View.getImportantForAccessibility()' su un oggetto nullo di riferimento

mi guardai intorno sia su Google e StackOverflow hanno trovato alcune informazioni. Tuttavia, non ho potuto farlo funzionare. Ora spero di poter ottenere aiuto con il mio codice.

Sono relativamente inesperto in fase di sviluppo Android.

Grazie in anticipo

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> 

Log

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) 
+1

tu conosci il 'return items.indexOf (getItem (position)); 'è uguale a' position' nel tuo caso? La prima cosa da provare è rimuovere il costruttore da 'List'. – Blackbelt

risposta

326

Nella tua public View getView metodo di cambiamento return null;-return convertView;.

+0

@ user2734182 puoi estendere la tua risposta e spiegare perché 'convertView' sarebbe mai' nullo', ha un significato speciale? –

+4

@dark_ruby: getView() di un adattatore necessario per restituire un 'View'.Se restituisci "null", riceverai lo stesso esatto messaggio di errore. – ariefbayu

+0

che ha funzionato per me, grazie @Pavya –

11

#use return convertView;

Codice:

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 listiner for remove button คลิกลบปุ่ม 

       rm_btn.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         modelList.remove(position); 
         notifyDataSetChanged(); 
        } 
       }); 

      } 

      ///#use return convertView; 
      return convertView; 
     } 
1

nel vostro baseadapter classe costruttore prova per inizializzare LayoutInflater, normalmente ho preferito questo modo,

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

a la cima della classe creare variabile LayoutInflater, spero che questo ti aiuti

Problemi correlati