【问题标题】:ListView footer only selectable after selecting listview item firstListView 页脚仅在首先选择 listview 项目后才可选
【发布时间】:2015-04-06 19:58:42
【问题描述】:

所以我已经搜索和搜索并尝试了我看到的所有方法,但似乎没有任何方法可以解决我的问题。我的列表视图使用自定义适配器生成,我添加了页脚视图和 onTouchMethod,并且我知道它正在与 lsitview 竞争焦点,并且列表视图正在获胜,因为我已经阅读了有关此错误的信息。但也许有些东西我看不到,我错过了。

我需要始终可以选择页脚视图,现在它只有在列表视图中选择了一个项目后才可以选择,然后一切都按预期工作。但是在第一次加载列表视图时,页脚没有响应。

这是我的代码。

customAdapter = new ListAdapter(this, R.layout.itemlistrow, store_data);
    customAdapter.setNotifyOnChange(true);

    listView.addFooterView(none_of_the_above, null, false);
    listView.setAdapter(customAdapter);

    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

listView.setOnItemClickListener(new OnItemClickListener(){

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



                none_of_the_above.setOnTouchListener(new View.OnTouchListener() {

                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    public boolean onTouch(View v, MotionEvent event) {
                        if (event.getAction() == MotionEvent.ACTION_DOWN) {
                            v.setSelected(true);
                            view.setSelected(false);
                            view.setActivated(false);
                            view.clearFocus();

                            Log.e("NoneOFTheAboveButton:onTouch", "clicked");
                            none_of_the_above.setBackground(getResources().getDrawable(R.drawable.store_setup2_found_selection_boxes_modified_states));
                        }
                        return false;
                    }
                });

listView.clearFocus();
                none_of_the_above.setSelected(false);
                view.setSelected(true);
                view.setActivated(true);

                selectedPosition = position;
                customAdapter.setSelectedPosition(selectedPosition);

}


    });

我的页脚按钮 xml

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/none_of_the_above"
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:layout_marginBottom="10dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:background="@drawable/store_setup2_found_selection_boxes_modified_states"
    android:focusable="true"
    android:clickable="true"
    android:text="NONE OF THE ABOVE" /> 

列表视图 xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/selection_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:clickable="false"
    android:focusable="false"
    android:descendantFocusability="blocksDescendants" >

我现在已经从 listview 的 OnItemClick 中取出 onTouchMethod 并将其放在上面,它会在第一次尝试时收到点击。但是现在 Listview 在先单击然后单击页脚时不会失去焦点。

【问题讨论】:

    标签: android listview android-listview android-button


    【解决方案1】:

    通过将 onTouch 方法放在 onItemClick 之外以及在 onItemClick 中放置一个方法来解决,以便在选择 listview 时与 listview 进行交互。

    还在onIemClick之外的onTouch方法内添加listview.clearChoices()

    【讨论】:

      【解决方案2】:

      移动你的

              none_of_the_above.setOnTouchListener(new View.OnTouchListener() {
      
                  @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                  public boolean onTouch(View v, MotionEvent event) {
                      if (event.getAction() == MotionEvent.ACTION_DOWN) {
                          v.setSelected(true);
                          view.setSelected(false);
                          view.setActivated(false);
                          view.clearFocus();
      
                          Log.e("NoneOFTheAboveButton:onTouch", "clicked");
                          none_of_the_above.setBackground(getResources().getDrawable(R.drawable.store_setup2_found_selection_boxes_modified_states));
                      }
                      return false;
                  }
              });
      

      listView.setOnItemClickListener() 之外。放在这一行之前,而不是onItemClick() 方法中。

      然后在onItemClick()方法中放:

      none_of_the_above.setTag(view);
      

      onTouch() 中使用这个:

      if (event.getAction() == MotionEvent.ACTION_DOWN) {
                          v.setSelected(true);
                          (v.getTag()).setSelected(false);
                          (v.getTag()).setActivated(false);
                          (v.getTag()).clearFocus();
      
                          Log.e("NoneOFTheAboveButton:onTouch", "clicked");
                          v.setBackground(getResources().getDrawable(R.drawable.store_setup2_found_selection_boxes_modified_states));
                      }
      

      【讨论】:

      • 执行此操作并收到点击,但列表视图焦点无法正常运行(单击页脚时不会取消选择)。页脚也没有保持焦点,当我继续下一个活动时,我检查是否选择了一个项目会出错。
      • 也许你的页脚布局默认有GONE可见性。
      • 经过一些测试,只有列表视图没有失去对页脚点击的关注。所以除了列表视图没有失去对点击的关注外,页脚的行为正常。您添加的最后一个添加项让我无法解析所有 v.getTag() 方法的方法。
      【解决方案3】:

      在您的 Button xml 中:

      android:clickable="false"
      

      如果列表中的元素可点击为真,则 onItemClickListener 将不起作用。

      android:clickable="true" mean's that it's not clickable?

      您还需要设置:

      android:focusable="false
      

      当第一次点击获得焦点时。

      https://stackoverflow.com/a/20473421/3956566

      【讨论】:

      • 这不起作用。两个都试过了。将 focusable 设置为 false 会给我 indexoutofbounds 异常以及不工作。
      • 列表视图有一个带有一堆文本视图的表格布局。按钮只是页脚。我现在的问题不是页脚接收焦点并在第一次单击时可选择,而是现在单击列表视图然后单击页脚时,列表视图不会失去焦点。
      • 知道为什么会这样吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多