0

カスタム アダプターにバインドされた ListView を保持するフラグメントを実装しようとしています。基本的に、1 つの行は次のようになります。 TextViewName ButtonPlus TextViewMarker ButtonMinus ButtonRemove ボタンのプラスとマイナスは、TextViewMarker によって表示される数値を変更します。ButtonRemove は、リストから行を削除します。最後に、リストに新しい項目を追加するボタンがあります。実行時にアイテムを追加および削除し、マーカーの数を変更できるため、すべてが正常に機能しているようです。残念ながら、アイテムを削除すると、リスト内の次のアイテムが削除されたアイテムのマーカーの数になります。ViewHolder がまだ同じ場所にあり、次のアイテムがタグを変更しただけのように。リストが空のときに同じ問題が発生します。新しいアイテムを追加すると、リストにあった最後のアイテムのマーカーの数が表示されます...

コードは次のとおりです。

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);
            }
        }
    }
}

ありがとう。

4

1 に答える 1

1

BaseAdapter の代わりに ArrayAdapter を実装することで、問題は解消されました。

于 2013-09-02T09:38:22.213 に答える