簡體   English   中英

重新使用View View for ListView時,保持LinearLayout不變

[英]Keep LinearLayout gone when reusing View it's in for ListView

正如標題所說,我有一個LinearLayout ,我用它作為ListView項的一部分。 當我點擊項目時,我需要將其LinearLayout可見性從View.GONEView.VISIBLE (反之亦然)。

我的問題是,當我單擊第一個項目(現在它的布局是可見的),然后向下滾動列表時,重用第一個項目的項目似乎將其布局的可見性設置為View.VISIBLE ,就像第一個項目一樣項目沒有,雖然它應該是View.GONE 未重復使用第一個項目的其余顯示項目按預期工作。

我清楚地理解為什么會發生這種情況,我想我需要為ListView每個項目存儲LinearLayout可見性(不僅當前顯示),然后在我的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();
        }
}

好吧,伙計們,我找到了解決方案。 我基本上做的是在類中添加一個布爾值來存儲我在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";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM