2

私はListViewカスタムレイアウトを持っています。このレイアウトにはEditTextButton行を削除する があります。

ユーザーがリストに項目を追加したり (外側のボタンをクリック)、リストから項目を削除したり (行のボタンをクリック) できるようにしたい。特定の行を削除できるようにするために (その位置が必要です) OnClickListener、アイテムの位置を変数として格納する場所を実装することにしました。

問題は、行を削除すると、次のすべての行リスナーが機能しなくなることです。何故ですか?

EditTextユーザーが終了したと判断したときに の値を取得する必要があるため、カスタム アダプターを実装し、そこに行を格納することにしました (ArrayList)。

これは私の活動です:

    private ListView mList;
    private TemplateFieldsAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.edit_template);

        customFieldsLayout = (LinearLayout) findViewById(R.id.customFieldsContent);

        numFields = 0;
        childs = new ArrayList<View>();

        //      mDragListen = new MyDragEventListener();

        mList = (ListView) findViewById(R.id.customFieldsList);
        adapter = new TemplateFieldsAdapter(this);

        mList.setAdapter(adapter);
        mList.setClickable(false);
    }

    public void AddField(View v){
        adapter.addItem();
        adapter.notifyDataSetChanged();
    }

そして、これは私のアダプターです:

public class TemplateFieldsAdapter extends BaseAdapter{

    private LayoutInflater inflater;

    private ArrayList<View> rows;
    private int count;

    private Context mContext;

    public TemplateFieldsAdapter(Context context){
        mContext = context;
        this.inflater = LayoutInflater.from(context);
        rows = new ArrayList<View>();
        count = 0;
    }

    @Override
    public int getCount() {
        return count;
    }

    @Override
    public View getItem(int position) {
        return rows.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(rows.size() <= position || rows.get(position) == null){ // If the View is not cached
            // Inflates the Common View from XML file
            rows.add(position, this.inflater.inflate(R.layout.template_field, null));
            rows.get(position).findViewById(R.id.removeImg).setOnClickListener(new DeleteRow(position));
        }       

        return rows.get(position);
    }

    public void addItem(){
        count ++;
    }

    private class DeleteRow implements View.OnClickListener{

        private int position;

        public DeleteRow(int pos){
            this.position = pos;
        }

        @Override
        public void onClick(View v) {
            rows.remove(position);
            count --;

            notifyDataSetChanged();
        }

    }

}

アイテムを削除するときにリスナーを更新する必要があることはわかっていますが (位置が変更されるため)、コードを削除して理解しやすくしました。

4 つの項目を追加してから、位置 1 の項目を削除すると、位置 2 と 3 (現在は位置 1 と 2) のリスナーが機能しなくなり、onClick 関数は呼び出されません。誰もそれを修正する方法を知っていますか?

ありがとう!

【追記】面白いものを見つけました。上記の例では、onClick 関数は呼び出されないと言いましたが、実際には呼び出されていません。しかし、その後、(新しい項目を追加するために) 外側のボタンをクリックすると、一度に呼び出されなかったすべての onClicks が呼び出されます。これは本当に奇妙です。[/編集]

4

2 に答える 2

0

そのように削除を使用します

 @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            View row = null;
            LayoutInflater inflater = getLayoutInflater();

            row = inflater.inflate(R.layout.one_result_details_row, parent, false);

            // inflate other items here : 
            Button deleteButton = (Button) row.findViewById(R.id.Details_Button01);
             deleteButton.setTag(position);

            deleteButton.setOnClickListener(
                new Button.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Integer index = (Integer) view.getTag();
                        items.remove(index.intValue());  
                        notifyDataSetChanged();
                    }
                }
            );
于 2013-06-10T15:59:44.017 に答える
0

それを解決する唯一の方法は、getView が呼び出されるたびにビューを作成することです。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(rows.size() <= position || rows.get(position) == null){ // If the View is not cached
            rows.add(position, this.inflater.inflate(R.layout.template_field, null));
        }       
        else{
            View newView = this.inflater.inflate(R.layout.template_field, null);
            ((TextView)newView.findViewById(R.id.etFieldName)).setText(((TextView)rows.get(position).findViewById(R.id.etFieldName)).getText());
            ((TextView)newView.findViewById(R.id.etFieldUnit)).setText(((TextView)rows.get(position).findViewById(R.id.etFieldUnit)).getText());

            rows.remove(position);
            rows.add(position, newView);
        }

        rows.get(position).findViewById(R.id.removeImg).setTag(position);
        rows.get(position).findViewById(R.id.removeImg).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Integer index = (Integer) v.getTag();
                rows.remove(index.intValue());
                count --;  
                mContext.updateList();
            }
        });

        rows.get(position).findViewById(R.id.etFieldName).requestFocus();

        return rows.get(position);
    }
于 2013-06-11T08:03:22.830 に答える