0

Android用の「スライドイン」(Facebookスタイル)メニューを作成しようとしています。このメニューは、onItemClickListenerを使用してクリック可能なListViewとしてレンダリングされます。ただし、リストビューにカスタム アダプターを使用すると、何も表示されません。

それを実行するアクティビティは、他のすべてのアクティビティがそれを拡張することを意味する私の「ルート アクティビティ」です。同じコードを別のアクティビティに配置すると、このアダプターを使用してリストビューを正常にレンダリングできます。また、.setOnItemClickListener はルート アクティビティで何もしないようです。このビューが作成されたときのように、何かがセットアップされません。何かアイデアはありますか? これはコードです:

public class RootActivity extends Activity {
public static final String KEY_TITLE = "title";
public static final String KEY_ID = "id";

ActionBar actionBar;
ListView slideMenu;

ListMenuAdapter adapter;
ArrayList<HashMap<String, String>> menuOptions;
private String[] menuItems={"Budget","Charts","By category"};

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

    menuOptions = new ArrayList<HashMap<String, String>>();
    slideMenu = (ListView) findViewById(R.id.slideMenuList);
    slideMenu.setSaveEnabled(false);

    HashMap<String, String> map;
    for(int i = 0 ; i<menuItems.length ; i++ ) {
        map = new HashMap<String, String>();
        map.put(KEY_TITLE, menuItems[i]);
        map.put(KEY_ID, ""+i);
        menuOptions.add(map);
    }

    adapter = new ListMenuAdapter(this, menuOptions);
    slideMenu.setAdapter(adapter);


    Log.println(9, "slidemendeb2", ""+slideMenu.getAdapter().getCount());
    slideMenu.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Log.println(9, "Testitemclick", ""+arg0);
        }
    });
}}

RootActivity を拡張する別のアクティビティのサンプル:

public class SpentMain extends RootActivity {
public static final String KEY_TITLE = "title";
public static final String KEY_ID = "id";

ArrayList<Tag> tags;
ArrayList<Integer> tagInts = new ArrayList<Integer>();
TagDataSource tagDataSource;
Button costButton;
EditText sum;
Boolean removed = false;

ActionBar actionBar;

CheckBox checkBox;
ListView list;
ListCheckboxAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.rootview);
    costButton = (Button) findViewById(R.id.costadd);
    sum = (EditText) findViewById(R.id.editText1);

    ArrayList<HashMap<String, String>> tagsList = new ArrayList<HashMap<String, String>>();
    tagDataSource = new TagDataSource(this);
    tagDataSource.open();
    tags = tagDataSource.getAllTags();
    tagDataSource.close();
    HashMap<String, String> map;
    for(int i = 0 ; tags.size()>i ; i++ ) {
        map = new HashMap<String, String>();
        map.put(KEY_TITLE, tags.get(i).getTitle().toString());
        map.put(KEY_ID, tags.get(i).getId().toString());
        tagsList.add(map);
    }

    list=(ListView)findViewById(R.id.list);

    adapter = new ListCheckboxAdapter(this, tagsList);
    list.setAdapter(adapter);

    // Row click event
    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            for(int i = 0; tagInts.size()>i; i++) {
                if(tagInts.get(i)==position) {
                    tagInts.remove(i);
                    removed = true;
                }
            } 

            if(removed==false) {
                tagInts.add(position+1);
            }
            removed = false;

            for(int i=0; i<((ViewGroup)view).getChildCount(); ++i) {
                View nextChild = ((ViewGroup)view).getChildAt(i);
                if(nextChild.getClass()==android.widget.CheckBox.class) {
                    checkBox = (CheckBox) nextChild;
                    if(checkBox.isChecked()==true) {
                        checkBox.setChecked(false);
                    } else {
                        checkBox.setChecked(true);
                    }
                }
            }
        }
    });}

私が言ったように、このアダプターを使用して SpentMain 内でレンダリングすると、正常に動作しますが、RootActivity 内では動作しません。どんな助けでも大歓迎です。

4

1 に答える 1

0

わかりましたので、なんとか問題を解決できました。私がしたことは、コードを RootActivity の onCreate から移動し、その on メソッド「buildSideMenu()」に移動することでした。次に、SpentMain.class onCreate メソッドでそのメソッドを次のように呼び出します。

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

setContentView(R.layout.rootview) の前に super.buildSideMenu() を呼び出すと、機能しないことに気付きました。そのため、問題は、setContentView の前に super.onCreate が実行されていたため、メニューの作成時に適切に設定されていなかった可能性があることでした。これが他の誰かを助けることを願っています!

于 2013-03-22T22:26:37.367 に答える