Android编辑ArrayAdapter行内联

时间:2013-12-04 08:04:47

标签: android android-arrayadapter edit

我有一个使用ArrayAdapter的ListActivity来显示行。 我想要内联编辑行,准确地说,我希望在用户点击视图时切换其中一个视图中的文本。例如。如果TextView Value id为“Complete”,它将变为“Incomplete”,反之亦然。

但问题是,行tvstate值始终是最后一行的值而不是点击的那一行。

我错过了一些基本的东西。请帮忙,因为我对Android开发很陌生。

编辑:即使不是内联编辑,即使是更新适配器中同一行的机制也会有所帮助。

这是我的适配器代码。

public View getView(final int position, View convertView,final ViewGroup parent) {

    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.rowlayout_cpe, null);
    }
    CPEDetails dt = items.get(position);
    if (dt != null) {
        tvSNo = (TextView) v.findViewById(R.id.serialNumber);
        tvState = (TextView) v.findViewById(R.id.state);
        if (tvSNo != null && tvState != null) {
        tvSNo.setText(dt.getVc_serial());
        tvState.setText(dt.getState());

        }
    }

    tvState.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
        tvState.setText(tvState.getText().toString().equalsIgnoreCase("Completed")?"Incomplete":"Completed");
        Utility.i("On Click State ::"+position);

        CPEDetails cpe = new CPEDetails();
        cpe.setVc_serial(tvSNo.getText().toString());
        cpe.setState(tvState.getText().toString());
        items.set(position, cpe);
        notifyDataSetChanged();
        }
    });


    btnDelete = (ImageButton) v.findViewById(R.id.btnDelete);
    btnDelete.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

        items.remove(position);

        notifyDataSetChanged();
        }
    });

    return v;

    }

2 个答案:

答案 0 :(得分:0)

这是因为您使用的自定义适配器缺少某些部分。

应该看起来像:

    ViewHolder holder; 
    View v = convertView;
    holder = null;

    if (v == null) {
        holder = new ViewHolder(); 
        LayoutInflater vi = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.rowlayout_cpe, null);
        holder.tvSNo = (TextView) v.findViewById(R.id.serialNumber);
        holder.tvState = (TextView) v.findViewById(R.id.state);

        v.setTag(holder);
    } else
        holder = (ViewHolder) v.getTag();

    CPEDetails dt = items.get(position);
    if (dt != null) {

        if (tvSNo != null && tvState != null) {
        holder.tvSNo.setText(dt.getVc_serial());
        holder.tvState.setText(dt.getState());

        }

    }

    class ViewHolder { 
        TextView tvSNo;
        TextView tvState;
    } 

... setonclicklistener代码的其余部分......

答案 1 :(得分:0)

我想你使用tvSNo和tvState作为适配器类的字段。每次调用getView(...)都会重写这些字段,所以在最后调用tvState之后,tbSNo会保存列表的最后一个可见行。 尝试使用ViewHolder模式,这是来自Google IO的Romain Guy演示文稿:http://youtu.be/N6YdwzAvwOA?t=2m。还有很多例子(http://goo.gl/YV6xaA - 这是第一个来自快速谷歌搜索)