我对三星手机上的简单 ListView 有疑问。
我以编程方式创建了一个新的 ListView。这些项目是简单的 TextView。我在列表视图中放置了一个监听器:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
view.setSelected(true);
}
});
TextView
(即 listView 的项目)使用 a作为ColorStateList
textColor(按下-->绿色;选择-->蓝色;默认-->红色)。
在模拟器上,一切都很好:默认情况下项目是红色的,当我按下一个时它变成绿色,当我松开它时它变成蓝色。如果我选择另一个项目:之前选择的变回红色,新选择的变蓝。
在我的三星设备上:默认情况下,项目是红色的,当我按下一个时它变成绿色,当我松开它时它再次变成红色(即未选中)。
这似乎是三星 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;
}
}
}