0

ExpandableListView を作成しようとしています。以下は、展開可能なリストのデータを作成するためのコードです。

DBHelper dbHelper;
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
HashMap<String, List<String>> hashDataChild;
ArrayList<DetailsOfLocation> arrayList;

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

expListView = (ExpandableListView) v.findViewById(R.id.lvExp); // get the listview
initializeDatabase();
        prepareChildData();

listAdapter = new ExpandListAdapter(getActivity(), arrayList, hashDataChild);
        expListView.setAdapter(listAdapter);

return v;
}

public void initializeDatabase()
{
    dbHelper = new DBHelper(getActivity());

    try {
        dbHelper.createDataBase();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        dbHelper.openDataBase();
    } catch (SQLException sqle) {
        throw sqle;
    }
}

private void  prepareChildData(){
    hashDataChild = new HashMap<String, List<String>>();

//arrayList has a multiple column in it where it will be displayed as the header. The data is from the database

    Integer id = ((MyApplication) getActivity().getApplication()).getID();
    arrayList = new ArrayList<DetailsOfLocation>();
    arrayList = dbHelper.getList(id);

 //child is the child's data
    List<String> child = new ArrayList<String>();
    child.add("Other Info");
    child.add("Picture");
    child.add("Contact");

//the header and child is being inserted
    for(DetailsOfLocation list : arrayList){
            hashDataChild.put(String.valueOf(list), child);
        }
    }
}

デバッグしているとき、hashDataChild には、各ヘッダーに 3 つの子が含まれていると予想される値があります。しかし、私の電話で試してみるとクラッシュし、logcat には何も表示されません。展開可能なリストビューを作成するために私が使用しているリファレンスは[これ]です: http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/

ExpandableListview OnGroupClickListener が機能していないためではないかと考えていましたか? どうすればこれを解決できますか? 私のonGroupClickの中に入りますが、子のリストは表示されません

 // Listview Group click listener
        expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                                        int groupPosition, long id) {
                Toast.makeText(
                        getActivity().getApplicationContext(),
                        arrayList.get(groupPosition)
                                + " : "
                                + hashDataChild.get(
                                arrayList.get(groupPosition)), Toast.LENGTH_SHORT)
                        .show();

                return false;
            }
        });

以下は、私の拡張可能アダプターのコードです

public class ExpandListAdapter extends BaseExpandableListAdapter {

private Context _context;
private ArrayList<DetailsOfLocation> mDetailsWithNoLocation;
private HashMap<String, List<String>> mchildOfDetailsWithNoLocation; 

public ExpandListAdapter(Context context, ArrayList<DetailsOfLocation> detailsWithNoLocation, HashMap<String, List<String>> HashChildData) {
    this._context = context;
    this.mDetailsWithNoLocation = detailsWithNoLocation; //header
    this.mchildOfDetailsWithNoLocation = HashChildData; //hash data
}


@Override
public Object getChild(int groupPosition, int childPosititon) {
    return this.mchildOfDetailsWithNoLocation.get(this.mDetailsWithNoLocation.get(groupPosition)).get(childPosititon);
}

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

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {

    final String childText = (String) getChild(groupPosition, childPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.expandlist_child_item, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.tvother_info);

    txtListChild.setText(childText);
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return this.mchildOfDetailsWithNoLocation.get(this.mDetailsWithNoLocation.get(groupPosition))
            .size();
}


@Override
public Object getGroup(int groupPosition) {
    return this.mDetailsWithNoLocation.get(groupPosition);
}

@Override
public int getGroupCount() {
    return mDetailsWithNoLocation.size();
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {


    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.expandlist_group_item, null);
    }

    TextView lblListDesc = (TextView) convertView.findViewById(R.id.tv_desc);
    TextView lblListRoom = (TextView) convertView.findViewById(R.id.tv_location);
    TextView lblListAudience = (TextView) convertView.findViewById(R.id.tv_audience);
    TextView lblListSpeaker = (TextView) convertView.findViewById(R.id.tv_speaker);


    DetailsOfLocation noLocationobj = mDetailsWithNoLocation.get(groupPosition);

    lblListDesc.setText(noLocationobj.getDesc());
    lblListRoom.setText("Room: "+noLocationobj.getLocation());
    lblListAudience.setText("Audience: "+noLocationobj.getAudience());
    lblListSpeaker.setText("Speaker/s: "+noLocationobj.getSpeaker());


    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

}

助けてくれてありがとう。


アップデート

onGroupClick() で true を返そうとしましたが、hashDataChild.get(arrayList.get(groupPosition)) は null です。arrayList をチェックするときに値がある場合でも、なぜそのようになるのですか?


これを使う理由が分かった気がします

if(!hashDataChild.containsKey(arrayList))

私の hashDataChild にはキーが含まれていません。理由と解決方法がわかりません。デバッグしているときでも、配列リストのキーと値が表示されますか?


containsKey を変更し、String.valueOf(arrayList.get(groupPosition))提案どおりに使用しました。しかし、私の子データはまだ表示されず、false を返しonGroupClick()、アプリケーションを閉じます。

4

1 に答える 1

1

さて、私はあなたのコードを試してみましたが、クリックするとNullPointerExceptionが発生します.mDetailsWithNoLocationのすべての呼び出しでString.valueOf()を見逃しています.アダプタでこれら2つのメソッドを変更してください.

@Override
public int getChildrenCount(int groupPosition) {
    return this.mchildOfDetailsWithNoLocation.get(String.valueOf(
            this.mDetailsWithNoLocation.get(groupPosition))).size();
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return this.mchildOfDetailsWithNoLocation.get(String.valueOf(
            this.mDetailsWithNoLocation.get(groupPosition))).get(
            childPosititon);
}

今すぐ作業する必要があります..メモ:他の人がコードをテストしやすくするために、質問にアクティビティコードも投稿する必要があります。これをテストするには、推測する必要があります.. :)

于 2015-07-21T03:09:26.170 に答える