0

から行要素を動的に追加および削除しようとしていますListView

の各要素はListViewですLinearLayout。行を追加したり削除したりできますが、行の順序が乱れ、正しい行が削除されるとは限りません。ArrayList<LinearLayout> rows行を追加するたびにmy のサイズが大きくなっていることを確認しましたが、への呼び出しgetItem(position)は常に null です。これが問題の原因だと思いますが、null レイアウトが に追加されるのはなぜrowsですか?

編集: ArrayAdapter パラメーターを LinearList から Row に変更しました。これは、2 つの EditText フィールドのゲッターとセッターを含む単純なオブジェクトです。これにより、null の問題は修正されましたが、同じ問題がまだ残っています。ランダムな行が削除されます。getView()以下では、Logcat はposition = 0、私の削除ボタンのすべてのケースでそれを示していますonClick()。Logcat は、ListView の各ビューにランダムに位置が割り当てられていることも示しています。

私の新しいアダプターコード:

public class RowAdapter extends ArrayAdapter<Row>{

    private ArrayList<Row> rows;

    public RowAdapter(Context context, int textViewResourceId, ArrayList<Row> rows) {
        super(context, textViewResourceId, rows);
        this.rows = rows;
    }

    public Row getItem(int position){
        return rows.get(position);
    }

    public int getCount(){
        return rows.size();
    }

    public static class ViewHolder {
        public EditText name;
        public EditText value;
        public Button delete; 
    }

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

        if(v == null){
            LayoutInflater li = (LayoutInflater)getContext().
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = li.inflate(R.layout.row, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.name = (EditText)v.findViewById(R.id.editAttrName);
            viewHolder.value = (EditText)v.findViewById(R.id.editAttrValue);

            viewHolder.delete = (Button)v.findViewById(R.id.btnDelete);
            viewHolder.delete.setTag(position);
            viewHolder.delete.setOnClickListener(new AdapterView.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = (Integer) v.getTag();
                    Log.e("RowAdapter", "position = " + position);
                    Row row = getItem(position);
                    rows.remove(row);
                    notifyDataSetChanged();
                }   
            });

            v.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)v.getTag();
        }
        Log.e("RowAdapter", "row " + v.toString() + ", position = " + position);    
        Row row = getItem(position);

        if(row != null) {

            EditText editText1 = (EditText)v.findViewById(R.id.editAttrName);
            EditText editText2 = (EditText)v.findViewById(R.id.editAttrValue);

            String text1 = editText1.getText().toString();
            String text2 = editText2.getText().toString();
            if(viewHolder.name != null) {
                viewHolder.name.setText(text1);
            }
            if(viewHolder.value != null) {
                viewHolder.value.setText(text2);
            }

        }

        return v;
    }
}
4

2 に答える 2

1

と呼ばれる組み込み関数public Row getItem(int position)を提供するため、関数を作成する必要はないと思います。また、アクティブなビューを呼び出しているときにリスト ビューであるか、リスト ビューへのハンドルを持っていることを確認してください。ArrayAdapter<T>getItemAtPosition(int position)getItemAtPosition(int position)view.getItemAtPosition(position)null

于 2012-04-04T06:51:51.713 に答える
1

あなたの問題はおそらく、 Adapters がビューのリストではなく、モデルのリストを含むことを意図していることです。ビューはgetView()メソッドによって生成される必要があります。したがって、実際に必要なのはRow、行を表すクラスを作成することです。その後、getView().

于 2012-04-03T23:56:35.647 に答える