2013-02-14 109 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 2013-02-14 14:07:45

+0

已經嘗試過,它沒有奏效。不管怎麼說,還是要謝謝你。 – Jonyjack 2013-02-14 20:57:17

回答

1

通過實現ArrayAdapter而不是BaseAdapter,問題消失了。