Android ListView目标自定义单元格文本框

时间:2012-10-26 09:00:17

标签: java android listview custom-cell

我有一个ListView,其中包含2 buttonslabeleditText的自定义单元格。我已经知道了,当我点击自定义单元格的按钮时,它会记录按钮被按下的位置。但是,当我按下按钮时,我无法理解如何制作它,它会更改该单元格的文本框中的文本。我无法弄清楚如何在一个位置引用它。

我的XML是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

     <ListView
         android:id="@+id/lvItems"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentLeft="true"
         android:drawSelectorOnTop="false" >

    </ListView>

</RelativeLayout>

我的代码:

    class CustomAdapter extends BaseAdapter
{

@Override
public int getCount() {

    return mDescription.size();
}

@Override
public Object getItem(int arg0) {

    return null;
}

@Override
public long getItemId(int arg0) {

    return 0;
}

@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {

    LayoutInflater inf=getLayoutInflater();
    View v=inf.inflate(R.layout.noncriticalasset, arg2,false);
    TextView tv=(TextView)v.findViewById(R.id.txtOption);

    final EditText et =(EditText)v.findViewById(R.id.tbAnswer);

    Button btPlus=(Button)v.findViewById(R.id.btnPlus);
    Button btMinus=(Button)v.findViewById(R.id.btnMinus);

    btMinus.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {

               int position = listView
                        .getPositionForView((View) v.getParent());
                Log.v("Position id", "" + position);

                et.setText("Test Text");

                notifyDataSetChanged();

            } catch (Exception e) {

                Log.e("error", "error" + e.getMessage());

            }


        }
    });



    tv.setText(mDescription.get(arg0).toString()); 



    return v;
}

我尝试仅使用et.setText()引用文本框,但它无法正常工作。有没有办法说atPosisiton.et.setText等?

非常感谢。

4 个答案:

答案 0 :(得分:1)

首先,我会坚持使用ListView的recycling pattern,它会更快地工作,因为每当ListView滚动并重新使用已创建/实例化的视图时,它都会减少ListView行项目视图的创建。为了保持EditText/CheckBox的值,您必须使用setTag()来保持其在ListView滚动时的位置。我曾为同一个here写了一篇博文。

答案 1 :(得分:0)

嗨声明适配器中的Button不在get视图和ViewHolder中。如下所示

按钮btPlus,btMinus; ViewHolder holder;

class ViewHolder {
  int fieldPossition;
 }

@覆盖     public View getView(int position,View v,ViewGroup arg2){

 holder = new ViewHolder();
LayoutInflater inf=getLayoutInflater();
  v=inf.inflate(R.layout.noncriticalasset, arg2,false);
    TextView tv=(TextView)v.findViewById(R.id.txtOption);

    EditText et =(EditText)v.findViewById(R.id.tbAnswer);

    btPlus=(Button)v.findViewById(R.id.btnPlus);
    btMinus=(Button)v.findViewById(R.id.btnMinus);


      fieldPossition = position;

    btMinus.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {

            ViewHolder deleteHolder = (ViewHolder) v.getTag();
                    //   
        int pos = deleteHolder.fieldpossition;
                Log.v("Position id", "" + position);

                et.setText("Test Text");

                notifyDataSetChanged();

            } catch (Exception e) {

                Log.e("error", "error" + e.getMessage());

            }


        }
    });



    tv.setText(mDescription.get(position).toString()); 

   btMinus.setTag(holder);


    return v;
}

就是这样。

答案 2 :(得分:0)

实际上你得到的位置是正确的,但是通过调用notifyDataSetChanged(),ListView将使用getView()方法用新的方法替换所有项目视图。 因此,您应该将点击的位置保留在某处,并在getView()中设置EditText。

答案 3 :(得分:-1)

编辑 经过测试确定
LazyViewHolder.class

 public class LazyViewHolder {
        private EditText et;
        private TextView text;
        private Button btnSub;
        public LazyViewHolder() {
            // TODO Auto-generated constructor stub
        }

        LazyViewHolder(TextView textView,EditText ed,Button btn) {
            super();
            this.setEt(ed);
            this.setText(textView);
            this.setBtnSub(btn);
        }

        public EditText getEt() {
            return et;
        }

        public void setEt(EditText et) {
            this.et = et;
        }

        public TextView getText() {
            return text;
        }

        public void setText(TextView text) {
            this.text = text;
        }

        public Button getBtnSub() {
            return btnSub;
        }

        public void setBtnSub(Button btnSub) {
            this.btnSub = btnSub;
        }




    }

自定义适配器中的getView()

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        final TextView textView;
        final EditText et;
        final Button sub;

        if (v == null) {
            v = inflater.inflate(R.layout.row, null);
            textView = (TextView) v.findViewById(R.id.tvLabel);
            textView.setText("Hello"+position);
            et = (EditText) v.findViewById(R.id.etWhatToFill);
            sub = (Button) v.findViewById(R.id.btnSubmit);
            v.setTag(new LazyViewHolder(textView, et, sub));
            sub.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                textView.setText(et.getText().toString());  
                }
            });
        } else {
            LazyViewHolder viewHolder = (LazyViewHolder) v.getTag();
            sub = viewHolder.getBtnSub();
            et=viewHolder.getEt();
            textView = viewHolder.getText();
        }
        return v;
    }

请查看ListView和CustomListView的详细说明 here