2015-02-19 11 views
111

Ich versuche eine Einkaufslisten-App zu erstellen, basierend auf Eingabefeldern, ArrayList, und ListView. Die App basiert auf Fragments. Ich bin jedoch auf ein Problem gestoßen und weiß nicht, wie ich es lösen soll.java.lang.NullPointerException: Versuch, die virtuelle Methode 'int android.view.View.getImportantForAccessibility()' für eine Null-Objektreferenz aufzurufen

Ich schaute auf Google und StackOverflow haben einige Informationen gefunden. Aber ich habe es nicht zur Arbeit gebracht. Jetzt hoffe ich, dass ich Hilfe mit meinem Code bekommen kann.

Ich bin relativ unerfahren in der Android-Entwicklung.

Vielen Dank im Voraus

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

du kennst die 'return items.indexOf (getItem (position));' ist gleich eine 'position' in deinem Fall? Das erste, was Sie ausprobieren müssen, ist den Konstruktor aus 'List' zu entfernen. – Blackbelt

Antwort

326

In Ihrem public View getView Methode ändern return null;-return convertView;.

+0

@ user2734182 können Sie Ihre Antwort erweitern und erklären, warum 'convertView' jemals' null' wäre, hat es eine besondere Bedeutung? –

+4

@dark_ruby: getView() eines Adapters erforderlich, um eine 'View' zurückzugeben.Wenn Sie "null" zurückgeben, erhalten Sie dieselbe genaue Fehlermeldung. – ariefbayu

+0

das hat für mich funktioniert, danke @ Pavya –

11

#use return convertView;

Code:

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

in Ihrem baseadapter Klasse Konstruktor try LayoutInflater zu initialisieren, in der Regel i auf diese Weise bevorzugt,

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

bei die Spitze von der Klasse create LayoutInflater Variable, hoffe das wird dir helfen

Verwandte Themen