0

我有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;
}

我尝试仅使用 an 引用文本框,et.setText()但没有成功。有没有办法说之atPosisiton.et.setText类的?

非常感谢。

4

4 回答 4

1

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

于 2012-10-26T09:08:30.980 回答
0

实际上你得到的位置是正确的,但是调用 notifyDataSetChanged() 后,ListView 将使用 getView() 方法将所有项目视图替换为新的。所以,你应该把点击的位置保持在某个地方,并在 getView() 中设置 EditText。

于 2012-10-27T15:02:38.517 回答
0

嗨声明适配器中的按钮不在获取视图和 ViewHolder 中。像下面

按钮 btPlus,btMinus; ViewHolder 支架;

class ViewHolder {
  int fieldPossition;
 }

@Override 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;
}

而已 。

于 2012-10-26T11:01:39.243 回答
-1

编辑 测试OK
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 的详细说明

于 2012-10-26T09:17:41.050 回答