1

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

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

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();
}
}

以及适配器曾经所属的旧活动的代码:

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();
....

这段代码曾经适用于我所有的其他 listViews,但由于它使用/依赖于不同的数组和其他东西,我不得不进行更改,这允许我保存显示的选定复选框。

4

3 回答 3

1

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

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) {
...

一个主要问题是我看不清楚你在哪里设置_index。我注意到它在您的笔记中的 setClicked 事件中,但是相对于您的其他代码,它在哪里?清晰度可能会更好。

无论如何,使用事件侦听器设置 _index 并检查 getView 中的变量的设计在同步方面存在问题。可能会单击事件或按钮,但这并不一定会触发 getView 方法进行刷新。请先为您的教育尝试一下,看看您的设计是否可行,但对不起,我有疑问。

于 2015-03-10T06:47:29.340 回答
0

我通常在某个 UI 元素(如 TextView)上设置属性,而不是在 convertView 上。在你的布局中试试这个:

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

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

于 2015-03-06T23:17:14.823 回答
0

我认为您的方法并不完全正确,您的大部分代码都不应该在 block 内if(convertView == null)。因为如果 convertView 不为空,你仍然需要设置属性setBackgroundResource,有意义吗?

而且我没有看到任何对 ListView 的代码引用,就像你说的那样。这是一个很好的最好的教程,可以让你有一个好的开始,因为你有很多工作要做。链接@Android ListView 复选框示例。让我们知道...汤米奎

于 2015-03-06T23:23:03.297 回答