Android ListView 中的 ImageButton 导致问题

ImageButton within an Android ListView causes problems

我是 Android 开发的新手,遇到了以下问题: 我有一个带有相应 ArrayAdapter 的 ListView,它提供简单的项目视图。项目视图以简单的 RelatveLayout 方式构建,如果使用 OnItemClickListener 和 OnItemLongClickListener 的回调方法单击或长按,则显示一些行为。到目前为止效果很好。但是,如果我将一个 ImageButton 添加到带有相应 onClick 回调的项目视图中,项目视图本身的原始侦听器方法将不再起作用。 ListView 中的项目也无法再被选中。为什么?

public class ProfileActivity extends Activity implements ActionBar.TabListener {

    private static final String DEBUG_TAG = ProfileActivity.class
            .getSimpleName();

    private XMLBinder profilesDao;
    private Config config;

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a {@link FragmentPagerAdapter}
     * derivative, which will keep every loaded fragment in memory. If this
     * becomes too memory intensive, it may be best to switch to a
     * {@link android.support.v13.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

        getActionBar().setSubtitle("Game Profiles");

        // load profiles:
        profilesDao = new XMLBinder(this);
        try {
            config = profilesDao.deserialize(Config.class,
                    R.raw.default_profiles);
        } catch (Exception e) {
            if (BuildConfig.DEBUG) {
                Log.e(DEBUG_TAG, e.toString());
            }
        }

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager(),
                config.getCategories());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        // For each of the sections in the app, add a tab to the action bar.
        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            // Create a tab with text corresponding to the page title defined by
            // the adapter. Also specify this Activity object, which implements
            // the TabListener interface, as the callback (listener) for when
            // this tab is selected.
            actionBar.addTab(actionBar.newTab()
                    .setText(mSectionsPagerAdapter.getPageTitle(i))
                    .setTabListener(this));
        }

        // SharedPreferences pref = getSharedPreferences("AGT",
        // Context.MODE_PRIVATE);
        // SharedPreferences.Editor prefEditor = pref.edit();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.profile, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        private List<Category> categories;

        /** */
        public SectionsPagerAdapter(final FragmentManager fm,
                final List<Category> categories) {

            super(fm);
            this.categories = categories;
        }

        @Override
        public Fragment getItem(int position) {

            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class
            // below).

            final List<Profile> profiles = config.getCategories().get(position)
                    .getProfiles();
            return PlaceholderFragment.newInstance(position + 1, profiles,
                    ProfileActivity.this);
        }

        @Override
        public int getCount() {

            // Show x total pages.
            return this.categories.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {

            return categories.get(position).getName();
        }
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment implements
            OnItemClickListener {

        private List<Profile> list;

        private ProfilesAdapter profilesAdapter;

        private Context context;

        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        /**
         * Returns a new instance of this fragment for the given section number.
         * 
         * @param list
         */
        public static PlaceholderFragment newInstance(int sectionNumber,
                List<Profile> list, Context context) {

            final PlaceholderFragment fragment = new PlaceholderFragment(list,
                    context);
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
            super();
        }

        /** */
        public PlaceholderFragment(List<Profile> list, Context context) {

            this();
            this.list = list;
            this.context = context;
            this.profilesAdapter = new ProfilesAdapter(this.context,
                    R.layout.view_profile, this.list);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            final View rootView = inflater.inflate(R.layout.fragment_profile,
                    container, false);

            // Configure the ListView with Adapter
            final ListView profilesView = (ListView) rootView
                    .findViewById(R.id.profilesView);
            profilesView.setAdapter(profilesAdapter);
            // @TODO:
            // profilesView.setDivider();
            // profilesView.setEmptyView(emptyView);
            profilesView.setOnItemClickListener(this);
            profilesAdapter.notifyDataSetChanged();

            return rootView;
        }

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

            if (view != null) {
                final GameProfile selectedProfile = (GameProfile) parent
                        .getItemAtPosition(position);
                final Intent intent = new Intent(this.context,
                        ChessClockActivity.class);
                intent.putExtra(GameProfile.INTENT_EXTRA_SELECTED_PROFILE,
                        selectedProfile);

                startActivity(intent);
            }
        }
    }

    /**
     * @author Andy
     *
     */
    public static class ProfilesAdapter extends ArrayAdapter<Profile> {

        private Context context;
        private List<Profile> profiles;

        /** */
        public ProfilesAdapter(Context context, int resource,
                List<Profile> profiles) {

            super(context, resource, profiles);

            this.context = context;
            this.profiles = profiles;
        }

        @Override
        public View getView(final int position, final View convertView,
                final ViewGroup parent) {

            View profileView = convertView;

            if (null == profileView) {
                final LayoutInflater inflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                profileView = inflater.inflate(R.layout.view_profile, null);
            }

            final TextView name = (TextView) profileView
                    .findViewById(R.id.profile_name);
            name.setText(profiles.get(position).getTitle());
            final TextView hint = (TextView) profileView
                    .findViewById(R.id.profile_desc);
            hint.setText(profiles.get(position).getHint());
            hint.setMaxLines(1);
            hint.setEllipsize(TruncateAt.END);
            return profileView;
        }
    }
}

不知道有没有用

ImageView yourImg=(ImageView).findViewById(R.id.icon);
yourImg.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    // things you want to do 
  }
});

使用

android:descendantFocusability="blocksDescendants"
android:focusable="false"

希望对您有所帮助