2015-12-02 101 views
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; 

} 

回答

1

你所到期是列表视图的回收机制。

当您进一步向下滚动时,您更改Listitem的外观并再次获取相同的Item。

您可以随时重置颜色,但干净的解决方案是提供2个项目类型。

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    return isSelected[position] ? 1 : 0; 
} 

那样ListView为您提供相同类型的recyled项目。

+0

对不起,我不太关注。你能指定我应该调用这两种方法吗?谢谢! – Joe

+0

您编辑的代码看起来不错,但您应该删除onClick中的v.setBackground调用。您的类型1应始终为绿色。所以只需将true添加到onclick – Michele

+0

的isSelected数组中,即可解决问题。我像你所说的那样删除了setBackground调用,并将它们移到了switch语句中的case中,并且做到了这一点 – Joe