2016-08-21 3 views
1

Как говорится в названии, у меня есть LinearLayout, который я использую как часть элемента ListView. Когда я нажимаю на элемент, мне нужно изменить видимость его LinearLayout от View.GONE до View.VISIBLE (или наоборот).Keep LinearLayout ушел при повторном использовании Посмотреть его в ListView

Проблема заключается в том, что когда я нажимаю на первый элемент (теперь его макет виден), и чем прокручивается список вниз, элемент, который повторно использует первый элемент, имеет видимость видимости макета, равную View.VISIBLE, точно так же, как и первый пункт сделал, хотя он должен был быть View.GONE. Остальные отображаемые элементы, которые не используют повторное использование первого, работают так, как они должны.

Я четко понимаю, почему это происходит, и я думаю, мне нужно, чтобы сохранить видимость LinearLayout для каждого отдельного пункта в моем ListView (не только в данный момент отображается), а затем использовать его в моем 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(); 
     } 
} 
+0

Не могли бы вы опубликовать адаптерами код и код активности, а? –

ответ

0

Alright ребята, я нашел решение. То, что я в основном делал, это добавить логическое значение в класс, в котором хранятся данные, которые я показываю в своем ListView (так как каждый элемент имеет свой собственный объект с данными, представляется хорошей идеей разместить видимость макета там). В моем методе getView() я просто извлекаю это значение и использую его как видимость для моего макета. При нажатии на View я обрабатываю его соответствующим образом, изменяя видимость внутри соответствующего объекта. Я также использую кнопку для изменения видимости от 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); 
       } 
      } 
     }); 
    } 

Вот мой класс, который хранит данные:

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"; 
    } 
} 
Смежные вопросы