2016-08-21 12 views
1

제목에서 알 수 있듯이 ListView 항목의 일부로 사용하는 LinearLayout이 있습니다. 항목을 클릭하면 LinearLayout의 표시를 View.GONE에서 View.VISIBLE (또는 그 반대)으로 변경해야합니다.재사용 할 때 LinearLayout은 사라지지 않게하십시오 ListView 용으로보기 List

제 문제는 첫 번째 항목을 클릭하면 (이제 레이아웃이 표시됨) 목록을 스크롤하는 것보다 첫 번째 항목을 재사용하는 항목의 레이아웃 가시성이 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

좋아 얘들 아, 나는 해결책을 찾아 냈다. 기본적으로 내가 수행 한 것은 데이터를 저장하는 클래스에 부울을 추가하는 것이 었습니다. 모든 항목에는 데이터가 포함 된 객체가 있기 때문에 레이아웃에 가시성을 두는 것이 좋습니다. 내 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"; 
    } 
} 
관련 문제