1

これはリストを展開するかわいいクッキーカッタープログラムで、子供をクリックすると「子供がクリックされました」というメッセージが表示されます。しかし、拡張可能なリストをレシピで構成して、クリックすると材料のポップアップウィンドウが表示されるようにしたいのです。文字列ではなくオブジェクトの配列リストにして、オブジェクトに材料のリストを含めてみましたが、材料を表示しようとすると、すべてが絡まってしまいました。よろしくお願いします。

package com.poe.poeguide;

import java.util.ArrayList;
import com.actionbarsherlock.app.SherlockActivity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ExpandableListView;
import android.widget.Toast;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
import com.actionbarsherlock.view.MenuItem;
import android.widget.ExpandableListView.OnChildClickListener;

public class Recipes extends SherlockActivity {
private ExpandableListView mExpandableList;

 /** An array of strings to populate dropdown list */
String[] actions = new String[] {
   "Recipes",
   "Main Page",
   "Attributes",
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recipes);

    /** Create an array adapter to populate dropdownlist */
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), R.layout.sherlock_spinner_item, actions);

    /** Enabling dropdown list navigation for the action bar */
    getSupportActionBar().setNavigationMode(com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_LIST);

    /** Defining Navigation listener */
    ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() {


        @Override
        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
            switch(itemPosition) {
            case 0:

                break;
            case 1:
                Intent a = new Intent(Recipes.this, MainActivity.class);
                startActivity(a);
                break;
            }
            return false;
        }

    };

    getSupportActionBar().setListNavigationCallbacks(adapter, navigationListener);
    adapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);



    mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list);

    ArrayList<Parent> arrayParents = new ArrayList<Parent>();
    ArrayList<String> arrayChildren = new ArrayList<String>();

    //======================================================================================
    //here we set the parents and the children
        //for each "i" create a new Parent object to set the title and the children
        Parent parent = new Parent();
        parent.setTitle("Pies");
        arrayChildren.add("Apple Pie ");
        arrayChildren.add("Blueberry Pie ");
        parent.setArrayChildren(arrayChildren);

        //in this array we add the Parent object. We will use the arrayParents at the setAdapter
        arrayParents.add(parent);

    //======================================================================================

    //sets the adapter that provides data to the list.
    mExpandableList.setAdapter(new MyCustomAdapter(Recipes.this,arrayParents));

    mExpandableList.setOnChildClickListener(new OnChildClickListener()
    {

        @Override
        public boolean onChildClick(ExpandableListView arg0, View arg1, int arg2, int arg3, long arg4)
        {
            Toast.makeText(getBaseContext(), "Child clicked", Toast.LENGTH_LONG).show();
            return false;
        }
    });

}


@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activity_recipes, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        // This ID represents the Home or Up button. In the case of this
        // activity, the Up button is shown. Use NavUtils to allow users
        // to navigate up one level in the application structure. For
        // more details, see the Navigation pattern on Android Design:
        //
        // http://developer.android.com/design/patterns/navigation.html#up-vs-back
        //
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

4

1 に答える 1

2

Recipes始める前に、これはアクティビティの紛らわしい名前であることに注意してください。「アクティビティ」という単語で終わるという標準的な規則に従うように名前を変更することを強くお勧めします(例:)RecipeActivity


Recipeまず、名前と材料を一緒に保存できるようにオブジェクトを作成する必要があります。このオブジェクトは、必要に応じて単純または複雑にすることができますが、次のようになっているとしましょう。

import java.util.List;

public class Recipe {
    private String name;
    private List<String> ingredients;
    private List<String> directions;

    @Override
    public String toString() {
        // By default, the Adapter classes in Android will call toString() on
        // your object to figure out how it should appear in lists. To make sure
        // the list displays the recipe name, we return the recipe name here.
        return name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getIngredients() {
        return ingredients;
    }

    public void setIngredients(List<String> ingredients) {
        this.ingredients = ingredients;
    }

    public List<String> getDirections() {
        return directions;
    }

    public void setDirections(List<String> directions) {
        this.directions = directions;
    }
}

このオブジェクトをオーバーライドtoString()して、レシピ名を返すことに注意してください。このように、オブジェクトのリストを表示するようにアダプタクラスに要求するとRecipe、リスト内の各アイテムにどのテキストを表示する必要があるかがわかります。


リストのデータを作成するときは、次の代わりに:

ArrayList<String> arrayChildren = new ArrayList<String>();

使用する:

List<Recipe> arrayChildren = new ArrayList<Recipe>();

(注:そのフィールドが現在のみ受け入れている場合は、取得するParentクラスList<Recipe>または子のジェネリックを変更する必要がある場合があります。)List<?>List<String>

Recipeサンプルオブジェクトを1つ追加しましょう。

Recipe salsa = new Recipe();
salsa.setName("Pineapple Salsa");
salsa.setIngredients(Arrays.asList("pineapple", "cilantro", "lime", "jalapeno"));
salsa.setDirections(Arrays.asList("Blend ingredients and enjoy"));
arrayChildren.add(salsa);

Recipeリストは文字列だけでなくオブジェクトによって支えられているので、リストアイテムがクリックされたときにそのオブジェクトを取得するだけです。これを行う方法は次のとおりです。

mExpandableList.setOnChildClickListener(new OnChildClickListener() {
    @Override
    public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {
        // Get the selected recipe
        Recipe recipe = (Recipe) parent.getExpandableListAdapter()
                .getChild(groupPosition, childPosition);

        // Build a string listing the ingredients
        StringBuilder message = new StringBuilder("Ingredients:\n");
        for (String ingredient : recipe.getIngredients())
            message.append("\n").append(ingredient);

        // Display a dialog listing the ingredients
        new AlertDialog.Builder(MyGreatHelloWorldActivity.this)
                .setTitle(recipe.getName()).setMessage(message)
                .setPositiveButton("Yum!", null).show();

        // Return true because we handled the click
        return true;
    }
});

更新:拡張可能なリスト用の飾り気のないアダプターを使用してタスクを完了する方法は次のとおりです。

子を保持するために(あなたのクラスExpandableListGroup に相当するParent)というジェネリッククラスを作成しました。このクラスは汎用であるため、あらゆる種類のオブジェクトで機能しますが、オブジェクトで使用しRecipeます。

import java.util.List;

public class ExpandableListGroup<T> {
    private String name;
    private List<T> children;

    public ExpandableListGroup(String name, List<T> children) {
        this.name = name;
        this.children = children;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<T> getChildren() {
        return children;
    }

    public void setChildren(List<T> children) {
        this.children = children;
    }

    @Override
    public String toString() {
        return name;
    }
}

次に、次のジェネリックExpandableListArrayAdapterクラスを作成しました。

import java.util.List;

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 ExpandableListArrayAdapter<T> extends BaseExpandableListAdapter {
    private List<ExpandableListGroup<T>> groups;
    private LayoutInflater inflater;

    public ExpandableListArrayAdapter(Context context,
            List<ExpandableListGroup<T>> groups) {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.groups = groups;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        ExpandableListGroup<T> group = getGroup(groupPosition);
        if (convertView == null) {
            convertView = inflater.inflate(
                    android.R.layout.simple_expandable_list_item_1, parent,
                    false);
        }

        TextView text = (TextView) convertView;
        text.setText(group.toString());
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        T item = getChild(groupPosition, childPosition);
        if (convertView == null) {
            convertView = inflater.inflate(
                    android.R.layout.simple_expandable_list_item_1, parent,
                    false);
        }

        TextView text = (TextView) convertView;
        text.setText(item.toString());
        return convertView;
    }

    @Override
    public T getChild(int groupPosition, int childPosition) {
        return groups.get(groupPosition).getChildren().get(childPosition);
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return groups.get(groupPosition).getChildren().size();
    }

    @Override
    public ExpandableListGroup<T> getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }

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

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

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

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

さて、これがあなたがそれをすべて一緒に結ぶ方法です:

// Create one list per group
List<Recipe> appetizers = new ArrayList<Recipe>(),
        desserts = new ArrayList<Recipe>();

// TODO: Create Recipe objects and add to lists

List<ExpandableListGroup<Recipe>> groups = Arrays.asList(
        new ExpandableListGroup<Recipe>("Appetizers", appetizers),
        new ExpandableListGroup<Recipe>("Desserts", desserts));
mExpandableList.setAdapter(new ExpandableListArrayAdapter<Recipe>(this,
        groups));
于 2012-12-23T05:35:22.687 に答える