2013-08-12 5 views
2

현재 사용자 지정 NumberPickers를 사용하여 ListView이 필요한 작업을하고 있습니다. 번호 선택 도구는 here으로 제안했습니다.사용자 지정 NumberPickers가있는 ListView - 증분 된 숫자가 표시되지 않습니다.

내가 직면하고있는 문제는 상당히 실망 스럽습니다. 숫자 선택 도구의 + 버튼을 클릭하면 텍스트보기는 0을 계속 표시합니다. 나는 모두 these suggestions을 시도했지만 아무 것도 변경되지 않았습니다.

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

    View vi = convertView; 

    //ViewHolder holder = new ViewHolder(); 

    if(vi == null) 
    { 
     holder = new ViewHolder(); 

     vi = inflater.inflate(R.layout.materialdialogcontent, null); 

     //Initialize Buttons and TextViews. 

     holder.num.setText("0"); 

     holder.add.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       counter++; 
       holder.num.setText("" + counter); 
      } 
     }); 

     holder.sub.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       counter--; 
       holder.num.setText("" + counter); 
      } 
     }); 


     //holder.pk = (NumberPicker)vi.findViewById(R.id.npMaterialAmount); 

     vi.setTag(holder); 
    } 
    else 
    { 
    holder = (ViewHolder)vi.getTag(); 
    } 

    holder.txt.setText(data.get(position).getName()); 
    //holder.pk.setMaxValue(20); 
    //holder.pk.setMinValue(0); 

    return vi; 
} 

public static class ViewHolder 
{ 
    TextView txt; 
    Button add; 
    Button sub; 
    TextView num; 
    //NumberPicker pk; 
} 

위의 코드는 내 ListView 어댑터에서 발견된다.

내가 위의 코드, 카운터는 증가를 디버깅 할 때 디버거 변수가 TextView의 텍스트가 실제로 카운터에 존재하는 숫자로 설정되고 있음을 보여줍니다

다음

내가 이미 시도 것입니다 그러나 표시된 숫자는 여전히 0입니다.

OnItemClickListener()ListView으로 설정하려고 시도했지만 아무 일도 일어나지 않습니다. 그런 다음 ListView Adapter 클래스에서 Button 클릭 청취자를 제거하고 ListView의 onItemClickListener() 안에 배치했습니다. 그러나 디버깅 할 때 Button 클릭 수신기는 디버거에서 건너 뜁니다.

다른 의견이 있으십니까?

가능한 모든 도움에 감사드립니다.

업데이트 :

holder.add.setTag(position); 
    holder.add.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      int position = (Integer)v.getTag(); 
      int temp = numPickerValues.get(position); 
      temp += 1; 
      numPickerValues.set(position, temp); 
      notifyDataSetChanged(); 
     } 
    }); 
    holder.num.setText(String.valueOf(numPickerValues.get(position))); 
    return convertView; 
+1

당신은 아마 잘못된 전망을 업데이트 : 일부 데이터 구조에서 현재 값을 저장하고 설정/그 목록에서 현재 값을 업데이트하는 것 그 행 번호 선택기를 처리하는 올바른 방법 'getView()'의 외부에서도 (그 카운터 변수의 사용법도 올바르지 않습니다). 어쨌든 원하는 것을 할 수있는 방법이 아니기 때문에 각 행에서 번호 선택 도구의 값을 잡고 업데이트해야합니다. 이 작은 요점을 한번보세요 https://gist.github.com/luksprog/6208731 – Luksprog

+0

@Luksprog 좋은 생각입니다. 나는 그것을 시도했지만 값은 변하지 않았다. 대신 ListList 내 행 수가 무작위이기 때문에 ArrayList를 사용해야했습니다. 그래도 여전히 작동하지 않습니다. 한번보세요. 위의 게시물에 코드를 삽입했습니다. – ClaireG

+0

홀더는 하나의 목록 뷰 행 안에 모든 구성 요소를 보유하는 클래스입니다. – ClaireG

답변

2

당신은 아마 다른 뷰를 업데이트하고를, 또한 카운터 변수는 확인 아니다 사용합니다. 홀더가 변수가 될 것으로 보인다로서,

View vi = convertView; 
ViewHolder holder; 
if(vi == null) { 
    holder = new ViewHolder(); 
    vi = inflater.inflate(R.layout.materialdialogcontent, null); 
    //Initialize Buttons and TextViews. 
    vi.setTag(holder); 
} else { 
    holder = (ViewHolder)vi.getTag(); 
} 
holder.txt.setText(data.get(position).getName()); 
holder.add.setTag(position); // so we have the proper position in the onClick method 
holder.add.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // there's no need for counter 
     int position = v.getTag(); 
     // numberpickervalues is the array/list of int values representing the values from all the row 
     // update the proper value 
     int temp = numPickerValues.get(position); 
     temp += 1; // incremment the value 
     numPickerValues.set(position, temp); 
     notifyDataSetChanged(); // let the list know about this change 
} 
}); 
holder.num.setText(String.valueOf(numberPickerValues.get(position))); 
0

이미 제안한 것처럼 일 전 다음 ViewHolder는 정적 클래스해야합니다. 정적 내부 클래스를 사용

private static class ViewHolder { 
    TextView txt; 
    Button add; 
    Button sub; 
    TextView num; 
    //NumberPicker pk; 
} 

한 가지 장점은 내부 클래스는 외부 클래스의 인스턴스없이 정적 메소드에서 접근 할 수 있다는 것이다.

holder.sub.setText("" + counter); 

그것은 안 : 감소시키는 경우

또한 나는 u는 버튼의 텍스트를 설정하는 이유를 볼 수없는 이유는 무엇입니까?

holder.num.setText("" + counter); 

나는 당신이 당신의 버튼으로 증가 할 때 가정, 아무 일도 발생하지 않습니다,하지만 당신은 다시이 증가 위치로 다음의 ListView에서 다른 위치로 이동 한 경우, 증가 된 값이 표시됩니다. 스크롤 할 때 ListView가 새로 고쳐지기 때문입니다. 는 단순히의 ListView보기를 새로

notifyDataSetChanged() 

를 호출합니다.

+0

오류를 감지하고 해결했습니다. 감사합니다. – ClaireG

0

호출하려면 notifyDataSetChanged()가 필요합니다.안드로이드 API

공공 무효 notifyDataSetChanged()

에서

은 기본 데이터가 된 변경 데이터 세트를 반영하는 어떤보기 자체를 새로해야했다고 첨부 관찰자에게 통지합니다.

+0

이전에 이미'adater.notifyDataSetChanged();'를 시도했습니다. – ClaireG

0

일단 증가하면 목록보기를 새로 고침해야한다고 가정합니다. 그리고 아래의 링크를 그렇게 따라 : 지금

Update ListView

+0

이전에 이미'adater.notifyDataSetChanged();'를 시도했습니다. – ClaireG

+1

그런 다음 링크의 다른 옵션을 선택하십시오. like : myListView.invalidateViews(); 뷰를 다시 그립니다. – Zax

+0

시도했습니다. 어느 쪽도 일하지 않고있다. 문자 그대로 옵션이 부족합니다. – ClaireG