我有一个可滚动的列表视图,可以选择多行。选中后,背景颜色变为绿色,如果再次选择,则会变回原始颜色。
我设法让它工作,但我遇到的问题是当我滚动时,其他行被突出显示为绿色,我没有选择。我认为这是因为视图正在被重用/回收,但我不确定如何解决这个问题。
代码:
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;
}
答案 0 :(得分:1)
您即将到期的是Listview的回收机制。
您可以更改Listitem的外观,并在向下滚动时再次获取相同的项目。
您可以随时重置颜色,但干净的解决方案是提供2种项目类型。
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return isSelected[position] ? 1 : 0;
}
ListView以这种方式为您提供相同类型的recyled项目。