2016-08-24 4 views
-1

Ich versuche, etwas Übung über Android ListView zu machen. Code unten ist in einem
listfragment:Einige Probleme mit Android-Listenansicht

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View view= inflater.inflate(R.layout.frag_getfriends,container,false); 
     friendsListView=(ListView)view.findViewById(android.R.id.list); 

     infoTextView=(TextView)view.findViewById(android.R.id.empty); 
     swipe=(SwipeRefreshLayout)view.findViewById(R.id.swipe_refresh); 
     swipe.setOnRefreshListener(this); 
     arrayAdapter=new DataListAdapter(getActivity(),R.layout.userinfo_list_config,null); 
     friendsListView.setAdapter(arrayAdapter); 
     friendsListView.setOnItemClickListener((parent,itemView,position,id)->{ 
      if(friends!=null){ 
        User friend=friends.get(position); 
       Toast.makeText(getActivity(),friend.getName(),Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     presenter.startQuery(true); 
     return view; 
    } 

Adapter Konstruktor ist:

public DataListAdapter(Context context, int itemLayoutResoureId, ArrayList<User>friends){ 
     super(context,itemLayoutResoureId,friends); 
     this.context=context; 
     this.users=new ArrayList<>(); 
     users.addAll(friends); 
    } 

Zu Beginn der listview keine Daten angezeigt werden, bis diese App einige Daten online abruft:

@Override 
    public void setDataList(ArrayList<User> friendsList) { 
     this.friends=friendsList; 
     arrayAdapter.clear(); 
     arrayAdapter.addAll(friendsList); 
     arrayAdapter.notifyDataSetChanged(); 
     friendsListView.setAdapter(arrayAdapter); 

    } 

Später kann ich einige aktualisieren.Und jede Aktualisierung passiert, der Rückruf

setDataList 

wird gefeuert und listview aktualisiert werden. Die App stürzte jedoch ab. Logcat zeigt:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mrdreamer.iknow/com.example.mrdreamer.iknow.Social.GetFriends}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 
                       at java.util.ArrayList.addAll(ArrayList.java:188) 
                       at com.example.mrdreamer.iknow.Social.DataListAdapter.<init>(DataListAdapter.java:35) 
                       at com.example.mrdreamer.iknow.Social.GetFriendsFrag.onCreateView(GetFriendsFrag.java:42) 
                       at android.app.Fragment.performCreateView(Fragment.java:2220) 
                       at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973) 
                       at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) 
                       at android.app.BackStackRecord.run(BackStackRecord.java:793) 
                       at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) 
                       at android.app.FragmentController.execPendingActions(FragmentController.java:325) 
                       at android.app.Activity.performStart(Activity.java:6252) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                       at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5417)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

Das Problem ist, dass in:

arrayAdapter=new DataListAdapter(getActivity(),R.layout.userinfo_list_config,null); 

der letzte Parameter nicht null sein kann, was ich verstehe. Jetzt sollte ich zu SimpleCursorAdapter wechseln oder nur eine Änderung am aktuellen Code vornehmen? :) Vielen Dank im Voraus.Ich bin neu bei Android Entwicklung.Ich bin sehr dankbar. :)

+0

laden Sie Ihr Crash-Log – Boopathi

+0

@ 吴 环宇, post Ur Adapter Klasse Konstruktor – shahid17june

+0

Verwenden Sie CustomArrayAdapter. Google es. – Nidhi

Antwort

0

können Sie versuchen wie dis `/ ********* Adapter-Klasse erweitert mit BaseAdapter und implementiert mit OnClickListener ************/ public class CustomAdapter erweitert BaseAdapter implementiert OnClickListener {

 /*********** Declare Used Variables *********/ 
    private Activity activity; 
    private ArrayList data; 
    private static LayoutInflater inflater=null; 
    public Resources res; 
    ListModel tempValues=null; 
    int i=0; 

    /************* CustomAdapter Constructor *****************/ 
    public CustomAdapter(Activity a, ArrayList d,Resources resLocal) { 

      /********** Take passed values **********/ 
      activity = a; 
      data=d; 
      res = resLocal; 

      /*********** Layout inflator to call external xml layout() ***********/ 
       inflater = (LayoutInflater)activity. 
              getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    /******** What is the size of Passed Arraylist Size ************/ 
    public int getCount() { 

     if(data.size()<=0) 
      return 1; 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    /********* Create a holder Class to contain inflated xml file elements *********/ 
    public static class ViewHolder{ 

     public TextView text; 
     public TextView text1; 
     public TextView textWide; 
     public ImageView image; 

    } 

    /****** Depends upon data size called for each row , Create each ListView row *****/ 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View vi = convertView; 
     ViewHolder holder; 

     if(convertView==null){ 

      /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
      vi = inflater.inflate(R.layout.tabitem, null); 

      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 
      holder.text = (TextView) vi.findViewById(R.id.text); 
      holder.text1=(TextView)vi.findViewById(R.id.text1); 
      holder.image=(ImageView)vi.findViewById(R.id.image); 

      /************ Set holder with LayoutInflater ************/ 
      vi.setTag(holder); 
     } 
     else 
      holder=(ViewHolder)vi.getTag(); 

     if(data.size()<=0) 
     { 
      holder.text.setText("No Data"); 

     } 
     else 
     { 
      /***** Get each Model object from Arraylist ********/ 
      tempValues=null; 
      tempValues = (ListModel) data.get(position); 

      /************ Set Model values in Holder elements ***********/ 

       holder.text.setText(tempValues.getCompanyName()); 
       holder.text1.setText(tempValues.getUrl()); 
       holder.image.setImageResource(
          res.getIdentifier(
          "com.androidexample.customlistview:drawable/"+tempValues.getImage() 
          ,null,null)); 

       /******** Set Item Click Listner for LayoutInflater for each row *******/ 

       vi.setOnClickListener(new OnItemClickListener(position)); 
     } 
     return vi; 
    } 

    @Override 
    public void onClick(View v) { 
      Log.v("CustomAdapter", "=====Row button clicked====="); 
    } 

    /********* Called when Item click in ListView ************/ 
    private class OnItemClickListener implements OnClickListener{   
     private int mPosition; 

     OnItemClickListener(int position){ 
       mPosition = position; 
     } 

     @Override 
     public void onClick(View arg0) { 


      CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity; 

      /**** Call onItemClick Method inside CustomListViewAndroidExample Class (See Below)****/ 

      sct.onItemClick(mPosition); 
     }    
    } 
}` 
0

Sie brauchen nicht friendsListView.setAdapter (arrayAdapter) zu verwenden; wieder in setDataList, weil Sie den Adapter bereits auf listview gesetzt haben. Sie haben notifydatasetchange aufgerufen. Es reicht aus, den Adapter mit neuen Elementen zu aktualisieren.

Verwandte Themen