2013-02-14 4 views
0

사용자 정의 어댑터에 바인딩 된 ListView를 보유하는 프래그먼트를 구현하려고합니다. 기본적으로 한 행은 다음과 같습니다. TextViewName ButtonPlus TextViewMarker ButtonMinus ButtonRemove +/- 버튼은 TextViewMarker에 표시된 숫자를 변경합니다. ButtonRemove는 목록에서 행을 제거합니다. 마지막으로 목록에 새 항목을 추가하는 버튼이 있습니다. 항목을 추가 및 제거하고 런타임에 마커 수를 변경할 수 있기 때문에 모든 것이 잘 작동하는 것 같습니다. 불행히도 항목을 제거하면 목록의 다음 항목에 제거 된 항목의 표식 수가 나타납니다. ViewHolder가 여전히 같은 위치에 있고 다음 항목이 방금 태그를 변경 한 것과 같습니다.ListView (안드로이드) 내의 태그 혼란

public class MarkerFragment extends Fragment 
{ 
    private MarkerAdapter mAdapter = null; 
    private EditText mAddItemEditText = null; 
    private MainActivity mParent = null; 

    public MarkerFragment(MainActivity parent){mParent = parent;} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View view = inflater.inflate(R.layout.fragment_marker, null); 

     Button b = (Button) view.findViewById(R.id.buttonAddItem); 
     b.setOnClickListener(new ClickListener(this)); 

     mAddItemEditText = (EditText) view.findViewById(R.id.editTextItem); 

     mAdapter = new MarkerAdapter(this, mParent); 
     ListView listView = (ListView) view.findViewById(R.id.markerList); 
     listView.setAdapter(mAdapter); 

     return view; 
    } 

    public void addItem(String name) 
    { 
     mAdapter.addItem(name); 
    } 

    public void removeItem(int position) 
    { 
     mAdapter.removeItem(position); 
    } 

    static class ViewHolder 
    { 
     TextView name; 
     TextView markers; 
     int position = -1; 
    } 

    private class MarkerAdapter extends BaseAdapter 
    { 
     private MarkerFragment mParent; 
     private LayoutInflater mInflater; 
     private ArrayList<String> mList; 

     public MarkerAdapter(MarkerFragment parent, Context context) 
     { 
      super(); 

      this.mParent = parent; 
      mInflater = LayoutInflater.from(context); 

      mList = new ArrayList<String>(); 
      mList.add("item1"); 
      mList.add("item2"); 
     } 

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

      if(convertView == null) 
      { 
       convertView = mInflater.inflate(R.layout.marker_row, null); 
       holder = new ViewHolder(); 

       holder.name = (TextView) convertView.findViewById(R.id.textViewRowName); 
       holder.markers = (TextView) convertView.findViewById(R.id.textViewMarker); 

       holder.markers.setText("0"); 

       Button b = (Button) convertView.findViewById(R.id.buttonPlus1Marker); 
       b.setRotation(180); 
       b.setOnClickListener(new ClickListener(this.mParent)); 

       b = (Button) convertView.findViewById(R.id.buttonMinus1Marker); 
       b.setOnClickListener(new ClickListener(this.mParent)); 

       b = (Button) convertView.findViewById(R.id.buttonRemoveMarker); 
       b.setOnClickListener(new ClickListener(this.mParent)); 

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

      holder.name.setText(mList.get(position)); 
      holder.position = position; 

      return convertView; 
     } 

     public void addItem(String name) 
     { 
      mList.add(name); 
      this.notifyDataSetChanged(); 
     } 

     public void removeItem(int position) 
     { 
      mList.remove(position); 
      this.notifyDataSetChanged(); 
     } 

     @Override 
     public int getCount() 
     { 
      return mList.size(); 
     } 

     @Override 
     public Object getItem(int position) 
     { 
      return mList.get(position); 
     } 

     @Override 
     public long getItemId(int position) 
     { 
      return position; 
     } 
    } 

    private class ClickListener implements OnClickListener 
    { 
     private StringBuilder sb = new StringBuilder(); 
     private MarkerFragment mParent = null; 

     public ClickListener(MarkerFragment parent) 
     { 
      mParent = parent; 
     } 

     @Override 
     public void onClick(View v) 
     { 
      switch(v.getId()) 
      { 
      case R.id.buttonAddItem: 
       addItem(); 
       break; 
      case R.id.buttonMinus1Marker: 
       alterMarkerNumber(v, -1); 
       break; 
      case R.id.buttonPlus1Marker: 
       alterMarkerNumber(v, 1); 
       break; 
      case R.id.buttonRemoveMarker: 
       removeItem(v); 
       break; 
      default: 
       break; 
      } 
     } 

     private void alterMarkerNumber(View v, int point) 
     { 
      View row = (View) v.getParent(); 
      ViewHolder holder = (ViewHolder) row.getTag(); 
      int markers = Integer.parseInt(holder.markers.getText().toString()) + point; 
      sb.delete(0, sb.capacity()).append(markers); 
      holder.markers.setText(sb.toString()); 
      mAdapter.notifyDataSetChanged(); 
     } 

     private void addItem() 
     { 
      String name = mAddCardEditText.getText().toString(); 
      if(name.length() > 0) 
      { 
       name = name.replace("'", " ").replace("\"", " "); 
       mAddItemEditText.setText(""); 
       this.mParent.addItem(name); 
      } 
     } 

     private void removeItem(View v) 
     { 
      View row = (View) v.getParent(); 
      ViewHolder holder = (ViewHolder) row.getTag(); 
      if(holder.position != -1) 
      { 
       this.mParent.removeItem(holder.position); 
      } 
     } 
    } 
} 
: 목록이 비어있을 때 나는 새 항목을 추가하는 경우, 그것은 여기

코드입니다 ... 목록에 있던 마지막 항목의 마커의 수를 표시합니다, 같은 문제가 발생

감사합니다.

+0

대신 ArrayList 요소를 위치별로 제거하는 대신 객체 (문자열)로 제거하십시오. 제거 할 문자열을 쉽게 가져올 수 있습니다 ... holder.position은 조금 복잡합니다 ... – Braj

+0

이미 시도했지만 작동하지 않았습니다. 어쨌든 고마워. – Jonyjack

답변

1

BaseAdapter 대신 ArrayAdapter를 구현하면 문제가 사라졌습니다.