Android:在基于listView的应用程序中处理onItemClick()

时间:2012-12-05 16:45:28

标签: android

我是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:列表'TextViews无法正常渲染:文本显示为浅灰色,而不是黑色! O.o

3 个答案:

答案 0 :(得分:0)

使用position而不是view来切换click事件的动作更有用。您的ListView应该从某种List中填充,因此当onClick触发时,为您提供位置,您可以在列表中引用该位置以了解所点击的内容。

答案 1 :(得分:0)

如果你想点击项目并在结果中它会转到另一个活动,例如,如果你有三个项目,当你点击项目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);
                }       
           }
     }

在这种情况下,您将在列表视图中选择项目时进行不同的活动,将您的注释放入进一步查询。

答案 2 :(得分: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);
    }

我有一张地图,它将包含菜单项的arraylist与导致菜单显示的字符串链接起来;在click事件中,我只是根据所选项目的文本检索arraylist。