2014-10-06 2 views
0

질문 텍스트 뷰와 두 개의 버튼 (예 및 아니오)이 포함 된 목록보기를 사용하고 있습니다. 아니오 버튼을 클릭하면 다른 레이아웃이 표시됩니다. , edittext를 포함합니다. 나는 위의 코드를 사용하고보기가 안드로이드의 목록보기에서 아래로 스크롤 된 후 반복적으로 발견 된 텍스트 편집 편집 됨

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.questions_list_item, null); 
     holder = new ViewHolder(); 
     holder.question = (TextView) convertView 
       .findViewById(R.id.question); 
     holder.questionNo = (TextView) convertView 
       .findViewById(R.id.questionNo); 
     holder.yesBtn = (ImageButton) convertView 
       .findViewById(R.id.yesButton); 
     holder.noBtn = (ImageButton) convertView 
       .findViewById(R.id.noButton); 
     holder.subQuestionLayout = (RelativeLayout) convertView 
       .findViewById(R.id.subQuestionLayout); 
     holder.subQuestion = (TextView) convertView 
       .findViewById(R.id.subQuestion); 
     holder.subQuestionAnswer = (EditText) convertView 
       .findViewById(R.id.subQuestionAnswer); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 

    } 

    setUpListeners(holder, position); 
    return convertView; 
} 


private void setUpListeners(final ViewHolder holder, final int position) { 

    holder.yesBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

         holder.subQuestionLayout.setVisibility(View.GONE); 



     } 

    }); 

    holder.noBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 


           holder.subQuestionLayout.setVisibility(View.VISIBLE); 
          // set subquestions 
          holder.subQuestion.setText(questionsModel.get(position) 
           .getQuestion_subquestion().get(0).getText().toString()); 
         } 
       } 

      } 


     } 
    }); 

: 다음은 목록보기 어댑터 내 코드입니다. 내가 동적 레이아웃이 보여주는 첫 번째 질문에 대한 버튼을 클릭하지 않으면 스크롤 다운을 시도했지만 같은 레이아웃이 여섯 번째 질문에도 표시됩니다. 어떻게 해결할 수 있습니까 ?? 제발 도와주세요

답변

0

이 줄을 getView()에도 추가 할 수 있습니다. holder.subQuestionLayout.setVisibility (View.GONE); 보기의 '초기'상태가 GONE인지 확인합니다. ListView에서보기가 다시 사용됩니다. 귀하의 경우 첫 번째 항목은 여섯 번째 항목에 대해 재사용됩니다. 그 이유는보기가 GONE 대신 VISIBLE 인 이유입니다.

+0

아니,; getView()에서 뷰가 스크롤 된 후에 이미 보이는 뷰가 보이지 않게되었습니다. – Gincy

+0

이 경우 어댑터에 int를 추가하거나 뷰가 VISIBLE 인 항목의 위치를 ​​보유하는 List 을 추가 할 수 있습니다. getView()에서 현재 위치가 해당 위치와 일치하는지 확인하고, 가시성을 VISIBLE로 설정하면 표시 여부를 설정할 수 있습니다. –

0

목록의 각 항목을 별도의 개체로 생각해야합니다. 종종 이러한 객체의 상태를 유지해야합니다. 예를 들어, 7 번째 항목의 배경이 빨간색으로 변경된 경우, 항목을 앞뒤로 스크롤 할 때 표시 될 때마다 해당 항목이 상태 (RED)에 머물 것으로 예상됩니다.

ListView의 경우 View은 대상을 표시하는 데 사용되며 재활용됩니다. 따라서 상태를 유지하기 위해 View에 의존하는 것이 잘못되었습니다. 오히려 모델 객체에 상태를 유지할 수 있습니다. ViewgetView()에 반환하기 전에 상태를 확인하고 이에 따라 View을 구성하십시오.

귀하의 경우 모델 클래스는 Question입니다. 그 클래스에서 yesClickednoClicked 두 개의 boolean을 추가하십시오.

private void setUpListeners(final ViewHolder holder, final int position) { 

    holder.yesBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Question q = //Get the object for position. 
     //This logic can change according to your need. I just write this by guess. 
     q.yesClicked = true; 
     q.noClicked = false; 
    } 

    }); 

    holder.noBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Question q = //Get the object for position. 
     //This logic can change according to your need. I just write this by guess. 
     q.noClicked = true; 
     q.yesClicked = false; 
    } 
    }); 
} 

수정하여 getView() 다음과 같이 내가 holder.subQuestionLayout.setVisibility (View.GONE)를 사용

public View getView(int position, View convertView, ViewGroup parent) { 

    //All other stuffs 

    Question q = //Get the object for position. 
    if(q.yesClicked){ 
      holder.subQuestionLayout.setVisibility(View.GONE); 
    } 
    if(q.noClicked){ 
      holder.subQuestionLayout.setVisibility(View.VISIBLE); 
      // set subquestions 
      holder.subQuestion.setText(questionsModel.get(position) 
        .getQuestion_subquestion().get(0).getText().toString()); 
    } 
    return convertView; 
} 
관련 문제