我的问题 - 我希望自定义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上使用键盘时,这种情况都不会发生。它可以正常工作,但是,当我按下列表项时,我只是试图模仿这个功能。我在网上找不到如何实现这一点。下面是片段和屏幕截图。
我有一个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的栗色像素,用于绘制列表项选择的栗色背景颜色。为了节省空间,我附上了自定义视图的截图:(我的第一篇文章,所以我不能:(
以下是自定义布局的简短片段,它定义了每个列表项(使用选框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”以获得滚动但是如上所述,我正在以编程方式执行当前选定的列表组合。
有人有解决方案吗?提前谢谢,我为冗长的帖子道歉...只是想彻底。再次感谢!
答案 0 :(得分:0)
您是否尝试使用自定义TextView :: New类并扩展TextView ::?然后覆盖onTouchEvent(MotionEvent event)
并且你说它在你机器人的键盘上运行良好。所以可能不是叫
super.onTouchEvent(MotionEvent event);
使用正确的密钥调用
onKeyDown(int keyCode, KeyEvent event)
或者这就够了
onTrackballEvent(MotionEvent event)
别忘了更改XML
答案 1 :(得分: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();
}
});
似乎在点击第二个项目时,第一个执行选框的人停止了,第二个开始选取。看起来它会自动取消选择其他以前选择的项目。