Android-Listview,带视窗座,可在按时更改选定行的背景

Android-Listview,带视窗座,可在按时更改选定行的背景,android,android-listview,row,android-viewholder,Android,Android Listview,Row,Android Viewholder,我一直在这个网站和其他网站上查找帖子,但没有找到适合我需要的工作代码。我目前有一个带有自定义行的listview,我让它们按颜色交替(灰色和透明)。我试图使所选行变为蓝色(并在按下另一行时返回到原始颜色),即使在滚动离开它时也保持选中状态 编辑:这是完整的列表适配器,减去几个图标的填充方式: public class MultiActivateAdapter extends ArrayAdapter<Model> { private final List<Model>

我一直在这个网站和其他网站上查找帖子,但没有找到适合我需要的工作代码。我目前有一个带有自定义行的listview,我让它们按颜色交替(灰色和透明)。我试图使所选行变为蓝色(并在按下另一行时返回到原始颜色),即使在滚动离开它时也保持选中状态

编辑:这是完整的列表适配器,减去几个图标的填充方式:

public class MultiActivateAdapter  extends ArrayAdapter<Model> {

private final List<Model> list;
private final List<Model> listInfo;
private final List<Model> listAlert;
private final List<Model> listSecondAlert;

private int _index = -1;

ArrayList<String> selectedStrings = new ArrayList<String>();

private final Activity context;
boolean checkAll_flag = false;
boolean checkItem_flag = false;

public MultiRenewAdapter2(Activity context, List<Model> list, List<Model> listInfo, List<Model> listAlert, List<Model> listSecondAlert) {
    super(context, R.layout.multirenewrow2, list);
    this.context = context;
    this.list = list;
    this.listInfo = listInfo;
    this.listAlert = listAlert;
    this.listSecondAlert = listSecondAlert;
}

static class ViewHolder {
    protected TextView text;
    protected ImageView alert;
    protected CheckBox checkbox;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflator = context.getLayoutInflater();

    ViewHolder viewHolder;

    if (convertView == null) {
        convertView = inflator.inflate(R.layout.multiactivaterow, null);

        viewHolder = new ViewHolder();
        viewHolder.alert = (ImageView) convertView.findViewById(R.id.alert);
        viewHolder.text = (TextView) convertView.findViewById(R.id.label);
        viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check);

        convertView.setTag(viewHolder);
        convertView.setTag(R.id.label, viewHolder.text);
        convertView.setTag(R.id.check, viewHolder.checkbox);

    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
        viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.

            }
        });


    if (position == _index)
    {
        convertView.setBackgroundColor(context.getResources().getColor(R.color.DeepSkyBlue));
    }
    else
    {
        convertView.setBackgroundColor(context.getResources().getColor(R.color.transparent));
        if (position % 2 == 0)
        {
            convertView.setBackgroundColor(Color.TRANSPARENT);
        }
        else
        {
            convertView.setBackgroundColor(Color.LTGRAY);
        }
    }


        viewHolder.checkbox.setTag(position); // This line is important.

    //some code removed to show icon population

    viewHolder.text.setText(list.get(position).getName());
    viewHolder.checkbox.setChecked(list.get(position).isSelected());

    return convertView;
}

public void setClicked(int index)
{
    _index = index;
    this.notifyDataSetChanged();
}
}
公共类MultiActivateDapter扩展了ArrayAdapter{
私人最终名单;
私人最终名单信息;
私人最终名单;
私人最终名单;
私有int_指数=-1;
ArrayList selectedStrings=新建ArrayList();
私人最终活动背景;
布尔checkAll_标志=false;
布尔checkItem_标志=false;
公共多重续订适配器2(活动上下文、列表、列表信息、列表警报、列表警报){
super(context,R.layout.multirenewrow2,list);
this.context=上下文;
this.list=列表;
this.listInfo=listInfo;
this.listAlert=listAlert;
this.listSecondAlert=listSecondAlert;
}
静态类视窗夹{
受保护的文本查看文本;
受保护的图像视图警报;
受保护复选框;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
持票人持票人;
if(convertView==null){
convertView=充气机。充气(R.layout.multiactivaterow,空);
viewHolder=新的viewHolder();
viewHolder.alert=(ImageView)convertView.findViewById(R.id.alert);
viewHolder.text=(TextView)convertView.findViewById(R.id.label);
viewHolder.checkbox=(checkbox)convertView.findViewById(R.id.check);
convertView.setTag(viewHolder);
setTag(R.id.label,viewHolder.text);
setTag(R.id.check、viewHolder.checkbox);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.checkbox.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
int getPosition=(Integer)buttonView.getTag();//这里我们使用setTag获取为复选框设置的位置。
list.get(getPosition).setSelected(buttonView.isChecked());//设置复选框的值以保持其状态。
}
});
如果(位置==\u索引)
{
setBackgroundColor(context.getResources().getColor(R.color.DeepSkyBlue));
}
其他的
{
setBackgroundColor(context.getResources().getColor(R.color.transparent));
如果(位置%2==0)
{
convertView.setBackgroundColor(Color.TRANSPARENT);
}
其他的
{
convertView.setBackgroundColor(Color.LTGRAY);
}
}
viewHolder.checkbox.setTag(位置);//这一行很重要。
//删除一些代码以显示图标填充
viewHolder.text.setText(list.get(position.getName());
viewHolder.checkbox.setChecked(list.get(position.isSelected());
返回视图;
}
已单击公共void setClicked(int索引)
{
_指数=指数;
this.notifyDataSetChanged();
}
}
以及适配器以前所属的旧活动中的代码:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {

                try {
                    adapt.setClicked(position);

                } catch (Exception e)  {
                    System.out.println(e);
                }
                adapt.notifyDataSetChanged();
....
listView.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、最终视图、整型位置、长id){
试一试{
适应。设置(位置);
}捕获(例外e){
系统输出打印ln(e);
}
adapt.notifyDataSetChanged();
....

这段代码过去适用于我的所有其他列表视图,但由于使用/依赖不同的数组和其他东西,我不得不对其进行更改,这使我能够保存显示的选定复选框。

我通常在特定UI元素(如TextView)上设置属性,而不是convertView。在布局中尝试以下操作:

android:focusable="true"
android:focusableInTouchMode="true"

一旦选中,这可能会在视图上突出显示。我通常将它们设置为false,因为我不需要突出显示行项目。

我认为您的方法不完全正确,如果(convertView==null),大多数代码不应该在块内
if(convertView==null)
。因为如果convertView不为null,您仍然必须设置属性,如
setBackgroundResource
,是否有意义

我没有看到任何像你所说的ListView的代码引用。这里有一个好的、最好的教程给你一个好的开始,因为你有很多工作要做。
Link@。随时通知我们…Tommy Kwee

现在您的代码看起来更清晰了,尽管它可以通过删除旧的或部分/重复的代码来使用清理作业。我的代码建议如下。基本上,您应该将复选框侦听器设置在convertView==null的if/else块之外。这两个条件都需要复选框事件

if (convertView == null) {
    convertView = inflator.inflate(R.layout.multiselectrow, null);

    viewHolder = new ViewHolder();
    viewHolder.alert = (ImageView) convertView.findViewById(R.id.alert);
    viewHolder.text = (TextView) convertView.findViewById(R.id.label);
    viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check);
    convertView.setTag(viewHolder);
    convertView.setTag(R.id.label, viewHolder.text);
    convertView.setTag(R.id.check, viewHolder.checkbox);

} else {
    viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
    list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.

    setClicked(getPosition);     // NEW
    }
});
if (position == _index) {
...
一个主要问题是我看不清楚您在哪里设置了索引。我注意到它在您的笔记中的setClicked事件中,但相对于您的其他代码,它在哪里?清晰度可能会更好


无论如何,使用事件侦听器设置_索引并检查getView中的变量的设计在同步中出现问题。可能会单击事件或按钮,但这不一定会触发getView方法进行刷新。请先尝试一下,以了解您的设计是否可行,但很抱歉我有疑问。

请为我们发布更多代码以帮助您。无论如何,我发布了两个答案以帮助您开始。我发布了更多,但如果您还需要什么,请告诉我。所有这些代码都来自适配器。在getView()中,有两行代码