gpt4 book ai didi

java - ListView 项目 state_selected 在真实设备上丢失

转载 作者:太空狗 更新时间:2023-10-29 14:23:47 26 4
gpt4 key购买 nike

我在三星手机上使用简单的 ListView 时遇到问题。

我以编程方式创建了一个新的 ListView。这些项目是简单的 TextView。我在我的 ListView 中放置了一个监听器:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true);
}
});

TextView(即 listView 的项目)使用 ColorStateList 作为文本颜色(按下-->绿色;选择-->蓝色;默认-->红色)。

在模拟器上,一切都很好:默认情况下项目是红色的,当我按下一个时它变成绿色,当我松开它时它变成蓝色。如果我选择另一个项目:之前选择的变回红色,新选择的变成蓝色。

在我的三星设备上:项目默认为红色,当我按下一个时它变成绿色,当我松开它时它再次变成红色(即未选中)。

这似乎是 Samsung ListView 实现中的一个错误 (这是一个自定义实现,没有源代码很难追踪)。

编辑:不是错误,而是由于触摸模式导致的行为略有不同(请参阅已接受答案中的链接)

您对如何解决此 错误/ 行为有任何想法吗?

附加约束:我不能使用 xml 选择器,因为我收到的颜色只能在运行时使用。

我的设备是 Samsung GT-B5330,API 15。(但我预计它会出现在大多数三星设备上)

这是完整的(可编译的)代码

import android.R;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class TestActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rootLayout = new RelativeLayout(this);
setContentView(rootLayout);

//create listView
ListView listView = new ListView(this);
listView.setAdapter(new MyListAdapter());
listView.setDivider(null);
listView.setDividerHeight(0);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView.setItemsCanFocus(false);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true);
}
});
listView.setBackgroundColor(Color.WHITE);

//positionning listView
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(100,200);
lp.setMargins(50,50,10,10);
rootLayout.addView(listView, lp);
}



private class MyListAdapter implements ListAdapter{

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ColorStateList colorStateList = new ColorStateList(
new int[][]{
new int[]{R.attr.state_pressed},
new int[]{R.attr.state_selected},
new int[]{-R.attr.state_selected},
},
new int[]{
Color.GREEN,
Color.BLUE,
Color.RED});
TextView textView = new TextView(parent.getContext());
textView.setText("Item " + position);
textView.setTextColor(colorStateList);
return textView;
}

@Override
public boolean areAllItemsEnabled() {
return true;
}

@Override
public boolean isEnabled(int position) {
return true;
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}

@Override
public int getCount() {
return 10;
}

@Override
public Object getItem(int position) {
return "data "+position;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public boolean hasStableIds() {
return true;
}


@Override
public int getItemViewType(int position) {
return position;
}

@Override
public int getViewTypeCount() {
return getCount();
}

@Override
public boolean isEmpty() {
return getCount()>0;
}
}
}

最佳答案

我手头没有三星设备(Galaxy Nexus 不算在内,它有普通的 Android 并且它在你的例子中工作得很好)所以我无法测试我的假设但似乎 ListView 放弃了 selected 状态项目发布后。您可以使用 HierarchyViewer 检查它(如果您的手机没有 root,请使用 Romain Guy 的 ViewServer)。

由于 TouchMode(请参阅 http://android-developers.blogspot.ru/2008/12/touch-mode.html),依赖具有触摸屏的选择是危险的。简而言之:当用户与触摸屏交互时,您没有选择(或焦点,顺便说一句)的概念。模拟器通常有方向键,因此它的行为可能略有不同。

所以我对您的建议是使用 state_checked 而不是 state_selected。安卓有 CheckedTextView这可能会有所帮助。只需调用 ListView 的 setItemChecked。此解决方案还具有在配置更改之间保持选中项目位置的良好特性,以及在按下其他项目时自动取消选中先前选中的项目(如果使用 CHOICE_MODE_SINGLE)。

如果它 Not Acceptable 并且您需要坚持使用 state_selected 那么您可以将您的 TextView 包装到 LinearLayout 中,它应该可以防止选择消失。但不要忘记,当 ListView 离开屏幕时,它会为其他列表项重用相同的 View ,因此您需要跟踪适配器中的选择状态以正确设置它。

关于java - ListView 项目 state_selected 在真实设备上丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14237978/

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