Android ViewBinding的onItemClickListener没有被调用。

huangapple go评论112阅读模式
英文:

Android ViewBinding onItemClickListener doesn't called

问题

请帮助解决为何视图绑定中的 onItemClickListener 无法正常工作的问题。

简要说明:我正在加载片段列表。需要通过点击项目选择要加载的片段,因此我为此实现了 AdapterView.OnItemClickListener。但是当我执行点击操作时,没有任何反应,方法不会被调用。

  1. public class ChooserFragment extends ListFragment implements AdapterView.OnItemClickListener {
  2. private ChooserFragmentBinding mBinding;
  3. private static final Class<?>[] CLASSES = new Class[]{
  4. EmailPasswordFragment.class,
  5. EmailPasswordFragment.class,
  6. };
  7. private static final int[] DESCRIPTION_IDS = new int[]{
  8. R.string.desc_emailpassword,
  9. R.string.desc_emailpassword,
  10. };
  11. @Nullable
  12. @Override
  13. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  14. mBinding = ChooserFragmentBinding.inflate(inflater, container, false);
  15. View view = mBinding.getRoot();
  16. CustomArrayAdapter adapter = new CustomArrayAdapter(getContext(), android.R.layout.simple_list_item_2, CLASSES);
  17. adapter.setDescriptionIds(DESCRIPTION_IDS);
  18. mBinding.list.setAdapter(adapter);
  19. mBinding.list.setOnItemClickListener(this);
  20. return view;
  21. }
  22. @Override
  23. public void onDestroyView() {
  24. super.onDestroyView();
  25. mBinding = null;
  26. }
  27. @Override
  28. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  29. Class<?> clicked = CLASSES[position];
  30. Log.d("Clicked", String.valueOf(position));
  31. }
  32. public static class CustomArrayAdapter extends ArrayAdapter<Class<?>> {
  33. private Context mContext;
  34. private int[] mDescriptionIds;
  35. public CustomArrayAdapter(Context context, int resource, Class[] objects) {
  36. super(context, resource, objects);
  37. mContext = context;
  38. }
  39. @SuppressWarnings("NullableProblems")
  40. @Override
  41. public View getView(int position, View convertView, ViewGroup parent) {
  42. View view = convertView;
  43. if (convertView == null) {
  44. LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  45. view = inflater.inflate(android.R.layout.simple_list_item_1, null);
  46. }
  47. ((TextView) view.findViewById(android.R.id.text1)).setText(mDescriptionIds[position]);
  48. return view;
  49. }
  50. public void setDescriptionIds(int[] descriptionIds) {
  51. mDescriptionIds = descriptionIds;
  52. }
  53. }
  54. }

XML 布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin">
  10. <ListView
  11. android:id="@android:id/list"
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"/>
  14. </FrameLayout>

谢谢。

英文:

Please, help to figure out why view binding onItemClickListener doesn't work.

To be short: I'm loading list of fragments. And need to choose fragment to load by clicking to item, so I implemented AdapterView.OnItemClickListener for this purpose. But when I perform a click - nothing happens, method does't called.

  1. public class ChooserFragment extends ListFragment implements AdapterView.OnItemClickListener {
  2. private ChooserFragmentBinding mBinding;
  3. private static final Class&lt;?&gt;[] CLASSES = new Class[]{
  4. EmailPasswordFragment.class,
  5. EmailPasswordFragment.class,
  6. };
  7. private static final int[] DESCRIPTION_IDS = new int[]{
  8. R.string.desc_emailpassword,
  9. R.string.desc_emailpassword,
  10. };
  11. @Nullable
  12. @Override
  13. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  14. mBinding = ChooserFragmentBinding.inflate(inflater, container, false);
  15. View view = mBinding.getRoot();
  16. CustomArrayAdapter adapter = new CustomArrayAdapter(getContext(), android.R.layout.simple_list_item_2, CLASSES);
  17. adapter.setDescriptionIds(DESCRIPTION_IDS);
  18. mBinding.list.setAdapter(adapter);
  19. mBinding.list.setOnItemClickListener(this);
  20. return view;
  21. }
  22. @Override
  23. public void onDestroyView() {
  24. super.onDestroyView();
  25. mBinding = null;
  26. }
  27. @Override
  28. public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) {
  29. Class&lt;?&gt; clicked = CLASSES[position];
  30. Log.d(&quot;Clicked&quot;, String.valueOf(position));
  31. }
  32. public static class CustomArrayAdapter extends ArrayAdapter&lt;Class&lt;?&gt;&gt; {
  33. private Context mContext;
  34. private int[] mDescriptionIds;
  35. public CustomArrayAdapter(Context context, int resource, Class[] objects) {
  36. super(context, resource, objects);
  37. mContext = context;
  38. }
  39. @SuppressWarnings(&quot;NullableProblems&quot;)
  40. @Override
  41. public View getView(int position, View convertView, ViewGroup parent) {
  42. View view = convertView;
  43. if (convertView == null) {
  44. LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
  45. view = inflater.inflate(android.R.layout.simple_list_item_1, null);
  46. }
  47. ((TextView) view.findViewById(android.R.id.text1)).setText(mDescriptionIds[position]);
  48. return view;
  49. }
  50. public void setDescriptionIds(int[] descriptionIds) {
  51. mDescriptionIds = descriptionIds;
  52. }
  53. }
  54. }

XML layout:

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
  2. &lt;FrameLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  3. android:layout_width=&quot;match_parent&quot;
  4. android:layout_height=&quot;match_parent&quot;
  5. android:orientation=&quot;vertical&quot;
  6. android:paddingBottom=&quot;@dimen/activity_vertical_margin&quot;
  7. android:paddingLeft=&quot;@dimen/activity_horizontal_margin&quot;
  8. android:paddingRight=&quot;@dimen/activity_horizontal_margin&quot;
  9. android:paddingTop=&quot;@dimen/activity_vertical_margin&quot;&gt;
  10. &lt;ListView
  11. android:id=&quot;@android:id/list&quot;
  12. android:layout_width=&quot;fill_parent&quot;
  13. android:layout_height=&quot;fill_parent&quot;/&gt;
  14. &lt;/FrameLayout&gt;

Thanks.

答案1

得分: 1

有没有某个原因,你必须使Fragment扩展ListFragment并实现AdapterView.OnItemClickListener接口?以正常方式尝试一下,看看会发生什么:

  1. mBinding.list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  4. Log.d("LOG", "test");
  5. }
  6. });
英文:

Is there some reason you have to have the Fragment extend ListFragment and implement AdapterView.OnItemClickListener? Try it the normal way and see what happens:

  1. mBinding.list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  2. @Override
  3. public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) {
  4. Log.d(&quot;LOG&quot;, &quot;test&quot;);
  5. }
  6. });

huangapple
  • 本文由 发表于 2020年9月1日 18:54:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/63686257.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定