2

私はAndroidが初めてです。私は listView ベースのアプリに取り組んでいます。メイン メニューがあり、アイテムをクリックすると、新しいアクティビティが別のメニューで開始されます。もう一度クリックすると、選択したコンテンツで新しいアクティビティが開始されます。私は非常に多くのメニュー項目を持っているので、考えられるすべてのケースを処理するリスナーを作成する必要があるため、似たようなものがあります:

    @Override public void onItemClick(AdapterView<?> listAdapter, View v, int position, long id) {              
       String text = ((TextView)v).getText().toString();
       //main menu
       if (text.equals(K.getStringById(K.ID_MAIN_THEORY))) {
          ...
       } else if (text.equals(K.getStringById(K.ID_MAIN_EXERCISE))) {
          ...
       }
       else if (text.equals(K.getStringById(K.ID_MAIN_TABLES))) {
          ...
       }
       //here other menus' items: lots of items
       ...
       //back item
       else if (text.equals(K.getStringById(K.ID_BACK))) {
          activity.finish();
       }

       Intent i = new Intent(...);
       startActivity(i);
    }
* K is a class that holds ids' references

ハードコーディングされたリスナーの動作を回避する方法はありますか?

** PS: リストの TextView が正しくレンダリングされません: テキストは黒ではなく薄い灰色に見えます! うーん

4

3 に答える 3

0

私はこのように解決しました:それはかなり良いと思います。

//This in K class, where MAPPED_HIERARCHY is a static field
static void activity(android.app.Activity a) {
    MAPPED_HIERARCHY = new HashMap<String, ArrayList<String>>();
    MAPPED_HIERARCHY.put(a.getResources().getString(R.string.app_name), K.array2list(a.getResources().getStringArray(R.array.menu_main)));
    MAPPED_HIERARCHY.put(a.getResources().getString(R.string.main_theory), K.array2list(a.getResources().getStringArray(R.array.menu_theory)));
    MAPPED_HIERARCHY.put(a.getResources().getString(R.string.main_exercise), K.array2list(a.getResources().getStringArray(R.array.menu_exercise)));
    ....
}
static ArrayList<String> getArrayListByString(String string) {
    ArrayList<String> copy = new ArrayList<String>(MAPPED_HIERARCHY.get(string).size());
    for (String s : MAPPED_HIERARCHY.get(string))
        copy.add(s);
    return copy; //defensive copy
}
//This in my listener class
@Override public void onItemClick(AdapterView<?> listAdapter, View v, int position, long id) {          
        String text = ((TextView)v).getText().toString();
        ArrayList<String> params = K.getArrayListByString(text);
        Intent i = new Intent(...);
        i.putExtra("params", params);
        activity.startActivity(i);
    }

メニュー項目を含む配列リストと、メニューが表示される文字列をリンクするマップがあります。クリックイベントでは、選択したアイテムのテキストに従って配列リストを取得するだけです。

于 2012-12-06T09:30:18.873 に答える
0

アイテムをクリックすると別のアクティビティに移動します。たとえば、3 つのアイテムがあり、アイテム A をクリックするとアクティビティ A にリダイレクトされ、B の場合は B にリダイレクトされます。

   lstview.setOnItemClickListener(new OnItemClickListener()  
     {
       private String input;
   public void onItemClick(AdapterView<?> v, View arg1, int index,long arg3)
          {
            if(index==1)
               {
                 Intent intnt=new Intent(v.getContext(),A.class);     
                 startActivity(intnt);
                }       
            else if (index==2)
           {
              Intent intnt=new Intent(v.getContext(),B.class);     
                 startActivity(intnt);
                }       
              else
                 {
                   Intent intnt=new Intent(v.getContext(),C.class);     
                 startActivity(intnt);
                }       
           }
     }

ここでは、リスト ビューでアイテムを選択するさまざまなアクティビティに進み、さらにクエリを実行するためにコメントを入力します。

于 2012-12-05T17:24:52.033 に答える
0

クリック イベントのアクションを切り替えるには、ビューではなく位置を使用する方が便利です。ListView はある種の List から生成される必要があるため、onClick が起動して位置が表示されると、List 内のその位置を参照して、何がクリックされたかを知ることができます。

于 2012-12-05T17:02:55.100 に答える