在可滚动列表视图上更改背景颜色

时间:2015-12-02 20:16:40

标签: android listview

我有一个可滚动的列表视图,可以选择多行。选中后,背景颜色变为绿色,如果再次选择,则会变回原始颜色。

我设法让它工作,但我遇到的问题是当我滚动时,其他行被突出显示为绿色,我没有选择。我认为这是因为视图正在被重用/回收,但我不确定如何解决这个问题。

代码:

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 个答案:

答案 0 :(得分:1)

您即将到期的是Listview的回收机制。

您可以更改Listitem的外观,并在向下滚动时再次获取相同的项目。

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

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

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

ListView以这种方式为您提供相同类型的recyled项目。