我有一个ListView
,其中包含2 buttons
,label
和editText
的自定义单元格。我已经知道了,当我点击自定义单元格的按钮时,它会记录按钮被按下的位置。但是,当我按下按钮时,我无法理解如何制作它,它会更改该单元格的文本框中的文本。我无法弄清楚如何在一个位置引用它。
我的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
等?
非常感谢。
答案 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