我有一个在三星手机上出现的简单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的项目)使用ColorStateList
作为textColor(按下 -> 绿色;选中 -> 蓝色;默认 -> 红色)。在模拟器上,一切都很好:项目默认为红色,当我按下一个时它变为绿色,当我释放它时它变为蓝色。如果我选择另一个项目:先前选择的将返回红色,并且新选择的将变为蓝色。
在我的三星设备上:项目默认为红色,当我按下一个时它变为绿色,当我释放它时它又变成了红色(即未选中)。
我的设备是三星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;
}
}
}