gpt4 book ai didi

Android ListView选择问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:34 25 4
gpt4 key购买 nike

大家好,

对于以下冗长的问题,我深表歉意......

我有一个 LinearLayout,其中包含一个 ListView 和一些其他项目。至于 ListView,它的每一行都是一个包含 3 个 View 的 LinearLayout - Checkbox、ImageView 和 TextView(从左到右 - 水平)。因为我希望在使用轨迹球时选择整行(用背景颜色突出显示),所以我将 LinearLayout 行内的所有三个 View 设置为不可聚焦,并且它起作用了。

关于此 ListView,现在我遇到了 2 个问题。首先,我希望每当我触摸 ListView 中的一行(用我的手指)时,获得与使用轨迹球时相同的行为 - 意味着我希望该行被选中(突出显示)。现在发生的情况是,当我触摸该行时,它真的被选中了,但是当我松开手指时,选择就消失了(很像在设备的联系人列表中发生的情况)。

其次 - 从菜单中,我可以显示一个新的 LinearLayout 而不是包含 ListView 的那个(不同应用程序的屏幕)。当发生这种情况时,我仍然存储包含 ListView 的 LinearLayout 的对象,因为我希望能够在以后重新显示它而不用从头开始创建它。问题是,当我用 ListView 重新显示 LinearLayout 时,没有选择 ListView 的行,即使当带有 ListView 的 LinearLayout“离开”屏幕时选择了 ceratin 行。

再次抱歉发了这么长的帖子。

谢谢!

最佳答案

是的,从 iOS 开发人员的角度来看,我发现很难应用“启动时设置默认选择”和“在用户单击行后记住选择状态 "到 ListView。

所以让我们先从“记住选择”开始。问题是即使你知道您可以使用选择器 xml 来定义高亮/按下/焦点样式。但是该样式不会在用户单击该行后保留。例如,我有一个像这样的突出显示选择器 xml(res/drawable 文件夹下的 list_selector.xml)(但您可能还有其他字段需要突出显示,例如行中 TextView 的文本颜色):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/list_selector_pressed" android:state_selected="true" />
</selector>

和定义高亮样式的list_selector_pressed.xml--设置背景色变成灰色:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_gray" />
</shape>
</item>
</layer-list>

正如@David Hedlund 建议的那样:

Rather, assign an OnItemClickListener, and have it store away the id of the selected item into some variable.

你需要在你的类之上创建一个实例变量:

    private View currentSelectedView;

然后去

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}

currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}

非常简单:我们检查 currentSelectedView 是否为 null 或当前点击的 View 。我们首先通过调用方法 unhighlightCurrentRow(currentSelectedView) 取消突出显示任何样式---您可能想知道为什么我们将即时变量 currentSelectedView 作为参数传递,我稍后会解释。然后我们将 View 分配给 currentSelectedView 并突出显示当前行;这样样式将在用户点击完成后保持不变。

private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.TRANSPARENT);
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.white));
}

private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(getResources().getColor(
R.color.dark_gray));
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.yellow));

}

啊哈,就是这样。这就是我们如何为 ListView 实现“记住选择”。正如你看到的,我们必须在 xml 和 java 代码中复制样式代码——非常愚蠢:(

接下来关于“设置默认选择”。你可能认为你可以做到这一点

listView.setAdapter(adatper)
listView.setSelection(0);
currentSelectedView = listView.getChildAt(0);
highlightCurrentRow(currentSelectedView);

在 Activity 中的 onCreate() 或 fragment 中的 onActivityCreated()。
但是如果你运行它,你会得到 NullPointer 异常,为什么?因为此时,listview 还没有渲染,Android 不喜欢 iOS 有 viewWillAppear。所以你必须创建一个即时变量来记住它是否是第一次呈现 ListView 单元格并在 onListItemClick 中取消设置该变量:

所以在 currentSelectedView 声明下:

private Boolean firstTimeStartup = true;

然后添加方法:假设我们要突出显示 ListView 中的第一行:

public class HomeAdapter extends ArrayAdapter<String> {
int layoutResourceId;

public HomeAdapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
layoutResourceId = textViewResourceId;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
layoutResourceId, null);
}

if (firstTimeStartup && postion == 0) {
highlightCurrentRow(convertView);
} else {
unhighlightCurrentRow(convertView);
}

TextView title = (TextView) convertView
.findViewById(R.id.menuTitle);
title.setText(getItem(position));
return convertView;
}
}

很简单。但是您需要在 onListItemClick 方法中进行一些更改:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {

if (firstTimeStartup) {// first time highlight first row
currentSelectedView = l.getChildAt(0);
}
firstTimeStartup = false;
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}

currentSelectedView = v;
highlightCurrentRow(currentSelectedView);

//other codes
}

给你!享受 Android :)

关于Android ListView选择问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2042278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com