【问题标题】:onListItemClick not firing in ListActivityonListItemClick 未在 ListActivity 中触发
【发布时间】:2012-05-22 11:49:46
【问题描述】:

在我的主要活动中,我有一个带有导航选项卡和操作项的 ActionBar。我的一个操作项调用了一个 ListFragment,它显示了一个带有图像和文本视图的自定义列表视图。我正在使用 ActionBarSherlock 来实现兼容性。这是我调用新 ListFragment 的代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Intent intent = new Intent(this, ERGProActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;
    case R.id.menuitem_search:
        onSearchRequested();
        return true;
    case R.id.menuitem_info:
        // Create new fragment and transaction
        SherlockListFragment aboutListFragment = new AboutListFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        ft.replace(R.id.root, aboutListFragment);
        ft.addToBackStack(null);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        // Commit the transaction
        ft.commit();
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

这是我的 ListFragment 代码:

public class AboutListFragment extends SherlockListFragment {

    private ListView listView;

    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         getActivity().setContentView(R.layout.aboutlist);

         CustomMenu menu_data[] = new CustomMenu[]
                { new CustomMenu(R.drawable.info, "About"),
                  new CustomMenu(R.drawable.legal, "Disclaimer"),};

                CustomMenuAdapter adapter = new CustomMenuAdapter(getActivity(), 
                        R.layout.listview_item_row, menu_data);
                listView = (ListView) getActivity().findViewById(R.id.listView1);
                listView.setAdapter(adapter);
     }

     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {
         switch (position) {
         case 0:
             // about
             Log.i("ABOUT"," - About Selected");
         case 1:
             Log.i("ABOUT"," - Disclaimer Selected");
             // disclaimer
         }
     }
}

这是我的 CustomAdapter 代码:

public class CustomMenuAdapter extends ArrayAdapter<CustomMenu> {
    Context context; 
    int layoutResourceId;    
    CustomMenu data[] = null;

    public CustomMenuAdapter(Context context, int layoutResourceId, CustomMenu[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        CustomMenuHolder holder = null;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new CustomMenuHolder();
            holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
            holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);

            row.setTag(holder);
        }
        else
        {
            holder = (CustomMenuHolder)row.getTag();
        }

        CustomMenu menu = data[position];
        holder.txtTitle.setText(menu.title);
        holder.imgIcon.setImageResource(menu.icon);

        return row;
    }

    static class CustomMenuHolder
    {
        ImageView imgIcon;
        TextView txtTitle;
    }
}

任何意见或建议将不胜感激!提前致谢。

感谢大家的意见!这是最终的工作代码:

 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
     getActivity().setContentView(R.layout.aboutlist);

     CustomMenu menu_data[] = new CustomMenu[]
            { new CustomMenu(R.drawable.info, "About"),
              new CustomMenu(R.drawable.legal, "Disclaimer"),};

            CustomMenuAdapter adapter = new CustomMenuAdapter(getActivity(), 
                    R.layout.listview_item_row, menu_data);
            listView = (ListView) getActivity().findViewById(R.id.listView1);
            // listView.setOnItemSelectedListener(this);
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    switch (position) {
                             case 0:
                                 Log.i("ABOUT"," - About Selected");
                                 break;
                             case 1:
                                 Log.i("ABOUT"," - Disclaimer Selected");
                                 break;
                             default:
                                 // do nothing
                                 Log.i("ABOUT"," - default");
                                 break;
                                }
                    }
            });
    }

【问题讨论】:

  • 设置 textview 和 imageview 的 "focusable: false"。我认为它可能有效。
  • 您的列表视图中是否只有两个项目?现在,如果您单击列表中除前两项之外的任何内容,则不会因为您的 switch 语句而发生任何事情。您实际上是在尝试从文本视图或图像中获得点击吗?
  • 我试图从 listView 中获得点击。我能够让它工作,并且我也修复了我的 switch/case 语句。

标签: android android-fragments actionbarsherlock android-actionbar android-listfragment


【解决方案1】:
listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub

            }
        });

试试这个代码。

【讨论】:

  • 感谢您的回复。我能够使用 onItemClick 的变体使其工作。我会为其他有类似情况的人发布工作代码。
【解决方案2】:

使用下面的代码:

listView.setOnItemSelectedListener(this);

实现方法后,你会得到以下方法:

@Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub
Do your code here.....

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

【讨论】:

  • 感谢您的回复!我能够使用 yogesh kamaliya 的建议让它工作。
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多