0
我有一个可滚动的列表视图,其中可以选择多行。选中后,背景颜色会变为绿色,如果再次选中,则会变回原来的颜色。更改可滚动列表视图的背景颜色
我设法让它工作,但我遇到的问题是当我滚动时,其他行被突出显示绿色,我没有选择。我认为这是因为视图正在被重用/回收,但我不知道如何解决这个问题。
代码:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
myDB = new DatabaseHandler(getActivity());
listViewSchools = (ListView)getView().findViewById(R.id.listViewFromDB);
if (myDB.getSchoolCount() != 0){
SchoolsList.addAll(myDB.getAllSchools());
isSelected = new boolean[SchoolsList.size()];
}
populateSchoolsView();
listViewSchools.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
t_school item = SchoolsList.get(position);
if (isSelected[position]) {
v.setBackgroundColor(getResources().getColor(R.color.orig));
isSelected[position] = false;
}
else if (!isSelected[position]) {
v.setBackgroundColor(getResources().getColor(R.color.green));
isSelected[position] = true;
}
schoolAdapter.notifyDataSetChanged();
}
});
}
private void populateSchoolsView() {
schoolAdapter = new SchoolListAdapter();
listViewSchools.setAdapter(schoolAdapter);
schoolAdapter.notifyDataSetChanged();
}
private class SchoolListAdapter extends ArrayAdapter<t_school> {
public SchoolListAdapter() {
super(getActivity(), R.layout.itemschool_layout, SchoolsList);
}
@Override
public View getView(int position, View view, ViewGroup parent) {
View row = view;
ViewHolder holder = new ViewHolder();
if (row == null) {
row = getActivity().getLayoutInflater().inflate(R.layout.itemschool_layout, parent, false);
holder.name = (TextView) row.findViewById(R.id.school_name);
row.setTag(holder);
}
else{
holder = (ViewHolder)row.getTag();
}
t_school currentSchool = SchoolsList.get(position);
if(currentSchool!=null){
holder.name.setText(currentSchool.getInfo());
}
return row;
}
}
public class ViewHolder
{
TextView name;
}
编辑
我试图实现getItemViewType()和getViewTypeCount(),但我不知道如果我在正确的轨道上。我遵循本教程以供参考:http://android.amberfog.com/?p=296但我可以在这些方法中使用一些更多的指导,以及是否在getView()中正确使用它们。
编辑代码:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
myDB = new DatabaseHandler(getActivity());
if(myDB.getSchoolCount()==0)
Toast.makeText(getActivity().getApplicationContext(), "Please Import Data", Toast.LENGTH_LONG).show();
listViewSchools = (ListView)getView().findViewById(R.id.listViewFromDB);
registerForContextMenu(listViewSchools);
listViewSchools.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
longClickedItemIndex = position;
return false;
}
});
if (myDB.getSchoolCount() != 0){
SchoolsList.addAll(myDB.getAllSchools());
isSelected = new boolean[SchoolsList.size()];
}
populateSchoolsView();
listViewSchools.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
t_school item = SchoolsList.get(position);
if (isSelected[position]) {
v.setBackgroundColor(getResources().getColor(R.color.orig));
isSelected[position] = false;
}
else if (!isSelected[position]) {
v.setBackgroundColor(getResources().getColor(R.color.green));
isSelected[position] = true;
}
schoolAdapter.notifyDataSetChanged();
}
});
}
private void populateSchoolsView() {
schoolAdapter = new SchoolListAdapter();
listViewSchools.setAdapter(schoolAdapter);
schoolAdapter.notifyDataSetChanged();
}
private class SchoolListAdapter extends ArrayAdapter<t_school> {
public SchoolListAdapter() {
super(getActivity(), R.layout.itemschool_layout, SchoolsList);
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return isSelected[position] ? 1 : 0;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
View row = view;
ViewHolder holder;
int type = getItemViewType(position);
if (row == null) {
holder = new ViewHolder();
switch ((type)) {
case 1:
row = getActivity().getLayoutInflater().inflate(R.layout.itemschool_layout, parent, false);
holder.name = (TextView) row.findViewById(R.id.school_name);
break;
case 0:
row = getActivity().getLayoutInflater().inflate(R.layout.itemschool_layout, parent, false);
holder.name = (TextView) row.findViewById(R.id.school_name);
break;
}
row.setTag(holder);
}
else{
holder = (ViewHolder)row.getTag();
}
t_school currentSchool = SchoolsList.get(position);
if(currentSchool!=null){
holder.name.setText(currentSchool.getSchool_info());
}
return row;
}
}
public class ViewHolder
{
TextView name;
}
对不起,我不太关注。你能指定我应该调用这两种方法吗?谢谢! – Joe
您编辑的代码看起来不错,但您应该删除onClick中的v.setBackground调用。您的类型1应始终为绿色。所以只需将true添加到onclick – Michele
的isSelected数组中,即可解决问题。我像你所说的那样删除了setBackground调用,并将它们移到了switch语句中的case中,并且做到了这一点 – Joe