当前选定列表项的Android Ellipsize跑马灯问题

3
我的问题 - 我想让自定义ListView中的TextView文本在列表项被选中时才进行跑马灯滚动。当列表项失去焦点时,我希望跑马灯停止滚动。我知道我需要将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上的键盘时,这些都不会发生。它按照预期工作,但我只是尝试在按下列表项时模拟此功能。我在网上没有找到太多关于如何实现这一点的信息。以下是代码片段和屏幕截图。
我有一个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>

列表选择器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的深红色像素,用于绘制列表项选择的深红色背景色。为了节省空间,我附上了自定义视图的截图:(这是我的第一篇帖子所以我不能 :(

以下是定义每个列表项(带有跑马灯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”以获得滚动效果,但如上所述,我是在对当前选定的列表项目进行编程操作。
是否有人有解决方案?先感谢您,对于冗长的帖子,我表示歉意...只是想尽可能详细。再次感谢!
2个回答

0

你尝试过使用自定义的TextView ::New类并扩展TextView::吗?然后重写onTouchEvent(MotionEvent event)。你说它在你的droid上的键盘上运行良好。所以可能不是调用

super.onTouchEvent(MotionEvent event);

而是使用正确的键调用

onKeyDown(int keyCode, KeyEvent event)

或者只需要这个

onTrackballEvent(MotionEvent event)

别忘了修改XML文件


0

我不确定你把那个 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();
        }
    });

看起来当第二个项目被点击时,第一个正在进行跑马灯的项目会停止,第二个项目开始跑马灯。似乎它会自动取消选择其他之前选择的项目。

您可以在此处查看gif文件的实际效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接