重新使用ViewView查看ListView

时间:2016-08-21 13:22:30

标签: android listview

正如标题所说,我有LinearLayout我用作ListView项目的一部分。当我点击项目时,我需要将其LinearLayout的可见性从View.GONE更改为View.VISIBLE(反之亦然)。

我的问题是,当我点击第一个项目(现在它的布局是可见的),然后向下滚动列表时,重复使用第一个项目的项目似乎将其布局的可见性设置为{{ 1}},就像第一个项目一样,尽管它应该是View.VISIBLE。其余未重复使用第一个项目的项目按其应有的方式运行。

我清楚地理解为什么会发生这种情况,我想我需要为View.GONE中的每个项目(不仅是当前显示的)存储LinearLayout的可见性,然后再使用它在我的ListView方法中。你们有什么想法我怎么做的?

我的活动中的一些代码:

getView()

1 个答案:

答案 0 :(得分:0)

好吧,伙计,我找到了解决方案。我基本上做的是在类中添加一个布尔值来存储我在ListView中显示的数据(因为每个项目都有自己的数据对象,因此将布局的可见性放在那里似乎是一个好主意)。在我的getView()方法中,我只检索该值并将其用作我的布局的可见性。当点击View时,我会相应地处理它,改变相应对象内部的可见性。我还使用一个按钮来更改View.VISIBLEView.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);
                }
            }
        });
    }

这是我的类存储数据:

public class AlarmClock {
    public static final boolean LIST_ITEM_IS_EXPANDED_BY_DEFAULT = true;
    public String whenAlarmRings;
    public boolean isViewExpanded;

    public AlarmClock() {
        this.isViewExpanded = LIST_ITEM_IS_EXPANDED_BY_DEFAULT;
        this.whenAlarmRings = "SomeDay";
    }
}