1

BaseExpandableListAdaptor を拡張する ExpandListAdapter クラスの LayoutInflator で Null Pointer Exception が発生します。

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ExpandListAdapter extends BaseExpandableListAdapter{
       private Context context;
       private ArrayList<ExpandListGroup> groups;

       public ExpandListAdapter(Context context, ArrayList<ExpandListGroup> groups){
           this.context=context;
           this.groups=groups;
       }

       public void addItem(ExpandListChild item, ExpandListGroup group){
           if(!groups.contains(group)){
               groups.add(group);
            }
            int index=groups.indexOf(group);
            ArrayList<ExpandListChild> ch=groups.get(index).getItems();
            ch.add(item);
            groups.get(index).setItems(ch);
       }

       public Object getChild(int groupPosition, int childPosition){
           ArrayList<ExpandListChild> chList=groups.get(groupPosition).getItems();
           return chList.get(childPosition);
       }

       public long getChildId(int groupPosition, int childPosition){
           return childPosition;
       }

       public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent){
           ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);
           if (view == null) {

               LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
               view = infalInflater.inflate(R.layout.expandlist_child_item, null); 
           }

               TextView tv = (TextView) view.findViewById(R.id.tvChild);
               tv.setText(child.getName().toString());
               tv.setTag(child.getTag());

               // TODO Auto-generated method stub
               return view;

      }

      public int getChildrenCount(int groupPosition) {
          ArrayList<ExpandListChild> chList = groups.get(groupPosition).getItems();
          return chList.size();
      }

      public Object getGroup(int groupPosition) {
          return groups.get(groupPosition);
      }

      public int getGroupCount() {
          return groups.size();
      }

      public long getGroupId(int groupPosition) {
          // TODO Auto-generated method stub
          return groupPosition;
      }

      public View getGroupView(int groupPosition, boolean isLastChild, View view, ViewGroup parent) {
           ExpandListGroup group = (ExpandListGroup) getGroup(groupPosition);
           if (view == null) {
                LayoutInflater inf = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
                view = inf.inflate(R.layout.two_lines_list_layout, null);
            }
            TextView tv = (TextView) view.findViewById(R.id.line_book);
            tv.setText(group.getName());
            TextView tv2 = (TextView) view.findViewById(R.id.line_author);
            tv2.setText(group.getAuthor());
            return view;
        }

        public boolean hasStableIds() {
             // TODO Auto-generated method stub
             return true;
        }
        public boolean isChildSelectable(int arg0, int arg1) {
             // TODO Auto-generated method stub
             return true;
        }
}

次の行で例外が発生しています: LayoutInflater infalInflater = (LayoutInflater)this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

また、その行に「静的フィールド Context.LAYOUT_INFLATER_SERVICE は静的な方法でアクセスする必要があります」という警告が表示されます

助けてください..!!

4

2 に答える 2

3

次の行で例外が発生しています: LayoutInflater infalInflater = (LayoutInflater)this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

それは であるからcontextですnull。あなたがコンストラクターにあなたを渡していることを確認してくださいActivityExpandListAdapter

また、その行に「静的フィールド Context.LAYOUT_INFLATER_SERVICE は静的な方法でアクセスする必要があります」という警告が表示されます

Activityコンストラクターをではなくを取るように変更してから、次のContextように変更します。

LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

に:

LayoutInflater infalInflater = whateverYouDecideToCallYourActivityDataMember.getLayoutInflater();
于 2013-07-20T22:28:04.077 に答える
2

最初は簡単な部分です。LAYOUT_INFLATER_SERVICE に静的な方法でアクセスする必要があるという警告では、 context.LAYOUT_INFLATER_SERVICE から Context.LAYOUT_INFLATER_SERVICE (大文字の「C」) に変更して、インスタンスではなくクラスを介して変数にアクセスする必要があります。

第 2 に、'context' 変数でヌル ポインター例外が確実に発生しているため、ExpandListAdapter をインスタンス化するときは常に、コンテキストにヌル値を指定しています。そのコードを教えてくれなかったので調べることはできませんが、onCreateView または onViewCreated で ExpandListAdapter をインスタンス化することをお勧めします。これをアクティビティで作成する場合は、アクティビティへの参照 (つまり「this」) を渡します。フラグメントで作成する場合は、getActivity() への呼び出しを渡します。Fragment がアクティビティに接続されていない場合、これは機能しません (これが問題である可能性があります)。

于 2013-07-20T22:32:01.473 に答える