【问题标题】:Android Ellipsize marquee issues with currently selected list item当前选定列表项的 Android Ellipsize 选取框问题
【发布时间】:2010-09-03 18:55:31
【问题描述】:

我的问题 - 我希望我在自定义 ListView 中拥有的 TextView 的文本仅在 ListView 中选择项目时才能滚动。当列表项失去焦点时,我希望选取框停止滚动。我知道我需要将 TextView 设置为启用 (setEnabled(true)) 才能滚动工作,但是当我在添加项目时这样做时,它们都会滚动,这不是我想要的行为(但为什么会发生这种情况确实是有道理的)。我尝试使用 ListView 的单击处理程序以编程方式设置它们以将 TextView 设置为启用 (setEnabled(true)),在私有变量中跟踪当前选定的项目,然后反过来设置以前的视图单击新项目时,TextView 启用状态为 false 等等。我希望这是有道理的。下面是一些可能更好地说明它的 Java 代码:

    private View tempListItemView = null;

    if (this.tempListItemView != null) {
       TextView tempTxtView = (TextView) tempListItemView.findViewById(R.id.txtArticleTitle);
       tempTxtView.setSelected(false);
       tempTxtView.setEllipsize(TruncateAt.END);
    }
    // Set marquee of currently selected list item
    TextView tt = (TextView) v.findViewById(R.id.txtArticleTitle);
    tt.setEllipsize(TruncateAt.MARQUEE);
    tt.setSelected(true);
    tempListItemView = v; 

这确实有效。但是,它有点笨拙。例如,如果前一个项目离开显示屏,它永远不会关闭,当我选择列表项目时,我会丢失我设置的所有自定义 listSelector 属性(见下文)。此外,我还有一些其他奇怪的行为,滚动 TextView 的背景项变为黑色(甚至整个 ListView listSelector 完全消失。当我在我的 Droid 上使用键盘时,这些都不会发生。它应该可以正常工作,但是我只是想在按下列表项时模拟这个功能。我在网上没有找到太多关于如何实现这一点的信息。下面是 sn-ps 和屏幕截图。

我有一个 ListActivity,我绑定到一个带有自定义列表视图的 ArrayAdapter。此活动所关联的内容视图如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
    android:id="@+id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@drawable/list_selector"
    />
</LinearLayout>

list_selector drawable 看起来像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:drawable ="@drawable/maroon_list_select_bg" />
  <item android:drawable="@drawable/maroon_list_select_bg" />
</selector>

它的 Drawable 只是一个 1x1 栗色像素,用于绘制列表项选择的栗色背景颜色。为了节省空间,我附上了自定义视图的截图:(我的第一篇文章,所以我不能:(

这里是定义每个列表项的自定义布局的简要 sn-p(带有选取框 TextView)...

            <TextView
                android:id="@+id/txtArticleTitle"
                android:textSize="16sp"
                android:textStyle="bold"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/list_item"
                android:singleLine="true"
                android:ellipsize="end">  
            </TextView>
            <TextView
                android:id="@+id/txtArticleSnippet"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@color/list_desc_copy"
                >
            </TextView>
            <TextView
                android:id="@+id/txtArticleVotes"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Votes: 1576"
                android:textColor="@color/list_small_copy"
                >
            </TextView>

请记住,我确实知道我需要将 android:ellipsize 设置为“marquee”才能获得滚动,但如上所述,我是以编程方式对当前选定的列表 tiems 执行此操作。

有人对此有解决方案吗?在此先感谢,我为冗长的帖子道歉……只是想彻底。再次感谢!

【问题讨论】:

    标签: android listview marquee android-arrayadapter


    【解决方案1】:

    您是否尝试过使用自定义 TextView ::New 类并扩展 TextView:: ?然后覆盖onTouchEvent(MotionEvent event) 你是说它与你机器人上的键盘配合得很好。所以可能不是调用

    super.onTouchEvent(MotionEvent event);

    用正确的键调用

    onKeyDown(int keyCode, KeyEvent event)

    或者这样就够了

    onTrackballEvent(MotionEvent event)
    

    不要忘记更改 XML

    【讨论】:

      【解决方案2】:

      我不确定你把 setSelected(true) 放在哪里。

      在我的情况下,我使用的是 GridView(也应该适用于 ListView)。我只是在 setOnItemClickListener 中执行此操作:

      gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
      
                  v.setSelected(true);
      
                  // FIXME - text not align in the background
                  Toast.makeText(getSherlockActivity()
                          , "click " + SHOWN_TRACKED_ITEMS.get(position).name, Toast.LENGTH_SHORT).show();
              }
          });
      

      似乎在点击第二个项目时,第一个做选取框的项目停止,第二个项目开始选取。看起来它会自动取消选择其他先前选择的项目。

      You can see it live here in gif file.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 2012-03-01
        • 2021-11-10
        • 1970-01-01
        相关资源
        最近更新 更多