Fragment ListView onItemClick 突出显示不正确的项目
Fragment ListView onItemClick Highlights Incorrect Item
我有一个 ListView
包含在 Fragment
中。在 onCreateView
部分,我为列表设置了 onItemClickListener
。我的目的是突出显示所选项目,但是单击后 ListViewItems
之间的 space 被着色而不是项目本身。
我也考虑过使用 Selector
但没有成功,IE: view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));
有办法解决这个问题吗?还是需要引入新的 Row
和 LayoutInflater
?提前致谢。
片段
public static class FragmentRoutine extends Fragment {
DatabaseHandler db;
private ListView routineListView;
private List<Routine> routines = new ArrayList<Routine>();
ArrayAdapter<Routine> routineAdapter;
Routine longClickedItemRoutines;
private SelectedAdapter selectedAdapter;
ImageButton btnMoveUp,btnMoveDown;
public FragmentRoutine() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.routines,
container, false);
db = new DatabaseHandler(getActivity().getApplicationContext());
routineListView = (ListView) rootView.findViewById(R.id.routineList);
registerForContextMenu(routineListView);
db.closeDB();
if (db.getRoutineCount() != 0)
routines.clear();
routines.addAll(db.getAllRoutines());
populateList();
selectedAdapter = new SelectedAdapter(this.getActivity(),0,routines);
selectedAdapter.setNotifyOnChange(true);
routineListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
longClickedItemRoutines = routines.get(position);
return false;
}
});
routineListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView adapterView, View view,
int position, long id) {
for (int h = 0; h < adapterView.getChildCount(); h++)
adapterView.getChildAt(h).setBackgroundColor(Color.TRANSPARENT);
// change the background color of the selected element
view.setBackgroundColor(Color.LTGRAY);
}
});// move up event handler
ImageButton btnMoveUp =(ImageButton) rootView.findViewById(R.id.btnMoveUp);
btnMoveUp.setOnClickListener(new AdapterView.OnClickListener() {
public void onClick(View arg0) {
moveUp();
}
});
// move down event handler
ImageButton btnMoveDown =(ImageButton) rootView.findViewById(R.id.btnMoveDown);
btnMoveDown.setOnClickListener(new AdapterView.OnClickListener() {
public void onClick(View arg0) {
moveDown();
}
});
setHasOptionsMenu(true);
return rootView;
}
错误在于您在 routineListView 上的 setOnItemClickListener。
更具体地说是 view.setBackgroundColor(Color.LTGRAY);
部分。
您在此处传递的视图是您的 ListView,而不是单击的列表元素。所以你要设置整个列表视图的背景颜色而不是单个元素。但是单个元素位于列表视图的顶部,因此您唯一可以看到颜色的地方是列表元素之间。
要更正此问题,您应该执行以下操作:
routines.get(position).setBackgroundColor(Color.LTGRAY);
这将正确获取单击的列表元素。
您不应在 setOnItemClickListener
中更新视图,而是记录此函数中的位置:
更新
mActiveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
sSelectedIndex = position;
// notify ListView's ArrayAdapter that the data attached has been changed,
// and any View reflecting the data set should refresh itself.
yourArrayAdapter.notifyDataSetChanged();
}
}
然后在 getView
方法中更新片段列表视图:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_menu, null);
}
if (position == sSelectedIndex) {
convertView.setBackgroundColor(...);
} else {
convertView.setBackgroundColor(...);
}
return convertView;
}
我有一个 ListView
包含在 Fragment
中。在 onCreateView
部分,我为列表设置了 onItemClickListener
。我的目的是突出显示所选项目,但是单击后 ListViewItems
之间的 space 被着色而不是项目本身。
我也考虑过使用 Selector
但没有成功,IE: view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));
有办法解决这个问题吗?还是需要引入新的 Row
和 LayoutInflater
?提前致谢。
片段
public static class FragmentRoutine extends Fragment {
DatabaseHandler db;
private ListView routineListView;
private List<Routine> routines = new ArrayList<Routine>();
ArrayAdapter<Routine> routineAdapter;
Routine longClickedItemRoutines;
private SelectedAdapter selectedAdapter;
ImageButton btnMoveUp,btnMoveDown;
public FragmentRoutine() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.routines,
container, false);
db = new DatabaseHandler(getActivity().getApplicationContext());
routineListView = (ListView) rootView.findViewById(R.id.routineList);
registerForContextMenu(routineListView);
db.closeDB();
if (db.getRoutineCount() != 0)
routines.clear();
routines.addAll(db.getAllRoutines());
populateList();
selectedAdapter = new SelectedAdapter(this.getActivity(),0,routines);
selectedAdapter.setNotifyOnChange(true);
routineListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
longClickedItemRoutines = routines.get(position);
return false;
}
});
routineListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView adapterView, View view,
int position, long id) {
for (int h = 0; h < adapterView.getChildCount(); h++)
adapterView.getChildAt(h).setBackgroundColor(Color.TRANSPARENT);
// change the background color of the selected element
view.setBackgroundColor(Color.LTGRAY);
}
});// move up event handler
ImageButton btnMoveUp =(ImageButton) rootView.findViewById(R.id.btnMoveUp);
btnMoveUp.setOnClickListener(new AdapterView.OnClickListener() {
public void onClick(View arg0) {
moveUp();
}
});
// move down event handler
ImageButton btnMoveDown =(ImageButton) rootView.findViewById(R.id.btnMoveDown);
btnMoveDown.setOnClickListener(new AdapterView.OnClickListener() {
public void onClick(View arg0) {
moveDown();
}
});
setHasOptionsMenu(true);
return rootView;
}
错误在于您在 routineListView 上的 setOnItemClickListener。
更具体地说是 view.setBackgroundColor(Color.LTGRAY);
部分。
您在此处传递的视图是您的 ListView,而不是单击的列表元素。所以你要设置整个列表视图的背景颜色而不是单个元素。但是单个元素位于列表视图的顶部,因此您唯一可以看到颜色的地方是列表元素之间。
要更正此问题,您应该执行以下操作:
routines.get(position).setBackgroundColor(Color.LTGRAY);
这将正确获取单击的列表元素。
您不应在 setOnItemClickListener
中更新视图,而是记录此函数中的位置:
更新
mActiveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
sSelectedIndex = position;
// notify ListView's ArrayAdapter that the data attached has been changed,
// and any View reflecting the data set should refresh itself.
yourArrayAdapter.notifyDataSetChanged();
}
}
然后在 getView
方法中更新片段列表视图:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_menu, null);
}
if (position == sSelectedIndex) {
convertView.setBackgroundColor(...);
} else {
convertView.setBackgroundColor(...);
}
return convertView;
}