Android 重复使用View it时保持LinearLayout消失';在ListView中

Android 重复使用View it时保持LinearLayout消失';在ListView中,android,listview,Android,Listview,正如标题所说,我有一个线性布局,作为列表视图项目的一部分。当我单击项目时,我需要将其线性布局的可见性从视图更改为视图可见(反之亦然) 我的问题是,当我单击第一个项目(现在它的布局可见)并向下滚动列表时,重用第一个项目的项目似乎将其布局的可见性设置为View.visible,与第一个项目完全相同,尽管它应该是View.GONE。显示的其他项目如果不重用第一个项目,则会按预期工作 我清楚地了解发生这种情况的原因,我想我需要为我的列表视图中的每个项目(不仅是当前显示的)存储线性布局的可见性,然后在我的

正如标题所说,我有一个
线性布局
,作为
列表视图
项目的一部分。当我单击项目时,我需要将其
线性布局的可见性从
视图更改为
视图可见(反之亦然)

我的问题是,当我单击第一个项目(现在它的布局可见)并向下滚动列表时,重用第一个项目的项目似乎将其布局的可见性设置为
View.visible
,与第一个项目完全相同,尽管它应该是
View.GONE
。显示的其他项目如果不重用第一个项目,则会按预期工作

我清楚地了解发生这种情况的原因,我想我需要为我的
列表视图中的每个项目(不仅是当前显示的)存储
线性布局的可见性,然后在我的
getView()
方法中使用它。你们知道我该怎么做吗

我的活动中的一些代码:

    public class MainActivity extends AppCompatActivity {
        ListView alarmClocksListView;
        ArrayList<AlarmClock> alarmClocksList;

        protected void onCreate(Bundle savedInstanceState) {
            alarmClocksList = new ArrayList<>();
            alarmsArrayAdapter = new AlarmsArrayAdapter(this, alarmClocksList);
            alarmClocksListView.setAdapter(alarmsArrayAdapter);
        }

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            //some code
            alarmClocksList.add(new AlarmClock());
            alarmsArrayAdapter.notifyDataSetChanged();
        }
}
public类MainActivity扩展了AppCompatActivity{
列表视图alarmClocksListView;
ArrayList Alarm时钟列表;
创建时受保护的void(Bundle savedInstanceState){
alarmClocksList=新建ArrayList();
alarmsArrayAdapter=新的alarmsArrayAdapter(此为alarmClocksList);
alarmClocksListView.setAdapter(alarmsArrayAdapter);
}
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
//一些代码
添加(新的AlarmClock());
alarmsArrayAdapter.notifyDataSetChanged();
}
}

好了,伙计们,我找到了解决办法。我基本上是在类中添加一个布尔值,该类存储我在
列表视图中显示的数据(因为每个项都有自己的数据对象,所以最好将布局的可见性放在那里)。而在我的
getView()
方法中,我只是检索该值并将其用作布局的可见性。单击
视图时,我会相应地处理它,更改相应对象内部的可见性。我还使用一个按钮将可见性从
View.VISIBLE
更改为
View.GONE
(对于感兴趣的人,该按钮的作用是什么)

这是我的适配器:

public class AlarmsArrayAdapter extends ArrayAdapter {

    ArrayList<AlarmClock> alarmClockArrayList;
    private Context context;

    static class ViewHolder {
        TextView whenAlarmRings;
        RelativeLayout additionalPanel;
        Button doneButton;
    }

    public AlarmsArrayAdapter(Context context, ArrayList<AlarmClock> alarmClocks) {
        super(context, -1, alarmClocks);
        alarmClockArrayList = alarmClocks;
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        AlarmClock alarmClock = alarmClockArrayList.get(position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.alarm_clock_item, parent, false);

            holder = new ViewHolder();
            holder.whenAlarmRings = (TextView) convertView.findViewById(R.id.whenAlarmRings);
            holder.additionalPanel = (RelativeLayout) convertView.findViewById(R.id.additionalPanel);
            holder.doneButton = (Button) convertView.findViewById(R.id.doneButton);

            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();


        if (alarmClock.isViewExpanded == true) {
            holder.additionalPanel.setVisibility(View.VISIBLE);
            holder.whenAlarmRings.setVisibility(View.GONE);
        } else {
            holder.additionalPanel.setVisibility(View.GONE);
            holder.whenAlarmRings.setVisibility(View.VISIBLE);
        }

        setListeners(holder, alarmClock, convertView);
        holder.whenAlarmRings.setText(alarmClock.whenAlarmRings);

        for (int i = 0; i < AlarmClock.DAYS_IN_WEEK; i++)
            holder.days[i].setChecked(alarmClock.weekDaysState[i]);
        return convertView;
    }

    private void setListeners(final ViewHolder holder, final AlarmClock alarmClock, final View convertView) {
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.whenAlarmRings.getVisibility() == View.VISIBLE) {
                    holder.whenAlarmRings.setVisibility(View.GONE);
                    holder.additionalPanel.setVisibility(View.VISIBLE);
                    alarmClock.isViewExpanded = true;
                    //convertView.setClickable(false);
                }
            }
        });

        holder.doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.whenAlarmRings.getVisibility() == View.GONE) {
                    holder.whenAlarmRings.setVisibility(View.VISIBLE);
                    holder.additionalPanel.setVisibility(View.GONE);
                    alarmClock.isViewExpanded = false;
                    //convertView.setClickable(true);
                }
            }
        });
    }

好了,伙计们,我找到了解决办法。我基本上是在类中添加一个布尔值,该类存储我在
列表视图中显示的数据(因为每个项都有自己的数据对象,所以最好将布局的可见性放在那里)。而在我的
getView()
方法中,我只是检索该值并将其用作布局的可见性。单击
视图时,我会相应地处理它,更改相应对象内部的可见性。我还使用一个按钮将可见性从
View.VISIBLE
更改为
View.GONE
(对于感兴趣的人,该按钮的作用是什么)

这是我的适配器:

public class AlarmsArrayAdapter extends ArrayAdapter {

    ArrayList<AlarmClock> alarmClockArrayList;
    private Context context;

    static class ViewHolder {
        TextView whenAlarmRings;
        RelativeLayout additionalPanel;
        Button doneButton;
    }

    public AlarmsArrayAdapter(Context context, ArrayList<AlarmClock> alarmClocks) {
        super(context, -1, alarmClocks);
        alarmClockArrayList = alarmClocks;
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        AlarmClock alarmClock = alarmClockArrayList.get(position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.alarm_clock_item, parent, false);

            holder = new ViewHolder();
            holder.whenAlarmRings = (TextView) convertView.findViewById(R.id.whenAlarmRings);
            holder.additionalPanel = (RelativeLayout) convertView.findViewById(R.id.additionalPanel);
            holder.doneButton = (Button) convertView.findViewById(R.id.doneButton);

            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();


        if (alarmClock.isViewExpanded == true) {
            holder.additionalPanel.setVisibility(View.VISIBLE);
            holder.whenAlarmRings.setVisibility(View.GONE);
        } else {
            holder.additionalPanel.setVisibility(View.GONE);
            holder.whenAlarmRings.setVisibility(View.VISIBLE);
        }

        setListeners(holder, alarmClock, convertView);
        holder.whenAlarmRings.setText(alarmClock.whenAlarmRings);

        for (int i = 0; i < AlarmClock.DAYS_IN_WEEK; i++)
            holder.days[i].setChecked(alarmClock.weekDaysState[i]);
        return convertView;
    }

    private void setListeners(final ViewHolder holder, final AlarmClock alarmClock, final View convertView) {
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.whenAlarmRings.getVisibility() == View.VISIBLE) {
                    holder.whenAlarmRings.setVisibility(View.GONE);
                    holder.additionalPanel.setVisibility(View.VISIBLE);
                    alarmClock.isViewExpanded = true;
                    //convertView.setClickable(false);
                }
            }
        });

        holder.doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.whenAlarmRings.getVisibility() == View.GONE) {
                    holder.whenAlarmRings.setVisibility(View.VISIBLE);
                    holder.additionalPanel.setVisibility(View.GONE);
                    alarmClock.isViewExpanded = false;
                    //convertView.setClickable(true);
                }
            }
        });
    }

您可以发布适配器代码和活动代码吗?您可以发布适配器代码和活动代码吗?