2014-06-15 3 views
0

목록보기가 있고 스크롤 할 수 있습니다. 목록 뷰 항목이 거의없고 데이터베이스에서 가져온 것입니다. 내 문제는, 각 listview 항목을 단추가 있고 getView 내부 단추에 setOnclickListener했습니다. 이제 5 개의 항목이 있고 항목 번호 1의 버튼을 탭하면 위치는 0이고 목록의 끝으로 스크롤하면 항목 번호 5의 버튼이 클릭 된 것을 볼 수 있습니다. 목록의 중간까지 스크롤 할 때, 때로는 버튼이 무작위로 클릭되고 내 logcat에서 볼 수 있습니다, particullar 버튼의 위치는 0입니다. 어떻게?스크롤 할 때 버튼 onclick의 위치가 목록보기로 변경됩니다.

여기 내의 getView '코드

public View getView(final int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.newsfeed_layout, parent, false); 
     } 
     final Button btnLike = (Button) v.findViewById(R.id.buttonLike); 
     btnLike.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        String buttonText = btnLike.getText().toString(); 
        if(buttonText.equals("LIKE")){ 
         Toast.makeText(postedItems.this, "Liked This item" + position, Toast.LENGTH_SHORT).show(); 
         btnLike.setPadding(4,0,12,0); 
         btnLike.setText("UNLIKE"); 
         btnLike.setTextColor(Color.parseColor("#ffffff")); 
         btnLike.setBackgroundResource(R.drawable.likedredbutton); 
        }else if(buttonText.equals("UNLIKE")){ 
         Toast.makeText(postedItems.this, "Unlike This Item" + position, Toast.LENGTH_SHORT).show(); 
         btnLike.setPadding(4,0,20,0); 
         btnLike.setText("LIKE"); 
         btnLike.setTextColor(Color.parseColor("#737373")); 
         btnLike.setBackgroundResource(R.drawable.cornerstyledbutton); 
        } 
      } 
     }); 
     return v; 
    } 

답변

1

먼저 문제를 이해하는 것입니다 : 당신이을 스크롤 ListView성능을 개선하기 위해, 뷰를 재사용하기 때문에 발생합니다. 이것이 convertView 매개 변수에 대한 설명입니다.

이 때문에 각 항목에 저장할 상태는 어댑터 자체 또는 백업 데이터를 저장할 위치에 저장해야하며 getView()을 구현하면 UI가 완전히 업데이트됩니다. 이 데이터를 반영합니다 (마지막으로 사용 된 속성을 사용자가 설정했기 때문에).

이 경우 각 항목이 '좋아요'또는 '좋아지지 않음'인지 여부를 저장해야합니다. 그리고 반환하기 전에 이것을 반영하도록 항상 btnLike의 속성을 설정하십시오.

예를 들어

, 코드가 더 많거나 적은 이렇게 될 것이다 : isLiked(position) 데이터, setLiked(position, boolean) 업데이트를하고 같은 버튼의 setButtonAsLike(Button)setButtonAsUnlike(Button) 갱신 시각적 속성을 조회

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = ...; 
    } 

    final Button btnLike = (Button) v.findViewById(R.id.buttonLike); 

    if (isLiked(position)) 
     setButtonAsUnlike(btnLike); 
    else 
     setButtonAsLike(btnLike); 

    btnLike.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if (!isLiked(position)) 
      { 
       // Not liked before, so like now. 
       setLiked(position, true); // store this value. 
       setButtonAsUnlike(btnLike); // the button is now "unlike" 
      } 
      else 
      { 
       // Liked before, unliked now. 
       setLiked(position, false); // store this value. 
       setButtonAsLike(btnLike); // the button is now "like" 
      } 
     } 
    }); 

    return v; 
} 

지금하고있다.

+0

안녕하세요. 시간과 솔루션을 제공해 주셔서 감사합니다. 나는 당신의 솔루션과 다소 혼동 스럽다. isLiked (position)는 데이터를 쿼리하지만 데이터를 쿼리하는 방법은 무엇입니까? 몇 가지 간단한 코드를 공유 할 수 있습니까? 고맙습니다. – Chivaa

+0

어댑터에 각 뉴스 피드 항목에 대한 배열 또는 목록이 포함되어있는 것 같습니다. 맞습니까? 거기에 "좋아하는"깃발이 있어야합니다. – matiash

+0

그래, 내가 그것을 시도하고 결과를 업데이 트하자. 그동안 고맙습니다. :) – Chivaa

관련 문제