java - 如何为列表适配器中的按钮创建 OnClickListener,这将允许我设置 EditText 视图的可见性
问题描述
我目前有一个包含按钮和 EditText 视图的列表视图。如何在我的列表适配器中正确实现 OnClickListener,以便在单击每个按钮时,通过 setVisibility 方法隐藏视图中的关联 EditText。
根据我当前在列表适配器中的 OnClickListener 实现,当我单击按钮以在视图中隐藏相应的 EditText 时,它会隐藏视口中的最后一个 EditText,并且不会隐藏它与视图相同的相应 EditText按钮。下面是我的 listview xml 文件 (inspection_single_row.xml)、我的列表适配器 (InspectionAdapter.java) 和主要活动 (MainActivity)。
检查_single_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Was the sink cleaned floors mopped"
android:id="@+id/text_id"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/check_boxes"
android:layout_marginBottom="20dp"
android:gravity="center_horizontal">
<RadioGroup
android:id="@+id/groupRadio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioComplete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Complete"
android:checked="false"
android:textColor="@color/grey_mid"/>
<RadioButton
android:id="@+id/radioIncomplete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Incomplete"
android:checked="false"
android:textColor="@color/grey_mid"
android:layout_marginLeft="25dp"/>
</RadioGroup>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="click"
android:onClick="clickMe"
android:id="@+id/btn"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/master_linlayout"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp">
<EditText
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginBottom="20dp"
android:gravity="top"
android:padding="10dp"
android:textSize="14sp"
android:background="@drawable/border2"
android:inputType="textMultiLine"
android:textColor="@color/grey_mid"
android:id="@+id/edit_text"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
检查适配器.java
public class InspectionAdapter extends ArrayAdapter<InspectionObject> {
ArrayList<InspectionObject> arrayList;
Context context;
int Resource;
LayoutInflater layoutInflater;
ProgressHolder holder;
public InspectionAdapter(Context context, int resource, ArrayList<InspectionObject> objects) {
super(context, resource, objects);
this.context = context;
arrayList = objects;
Resource = resource;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private static class ProgressHolder {
public RadioGroup radio_group;
public EditText deficiency_notes;
public TextView inspection_task;
public RadioButton radio_yes;
public RadioButton radio_no;
public LinearLayout master_layout;
public Button my_button;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
View v = convertView;
holder = new ProgressHolder();
if(v == null)
{
v = layoutInflater.inflate(Resource, null);
holder.radio_group = (RadioGroup)v.findViewById(R.id.groupRadio);
holder.deficiency_notes = (EditText)v.findViewById(R.id.edit_text);
holder.inspection_task = (TextView)v.findViewById(R.id.text_id);
holder.radio_yes = (RadioButton)v.findViewById(R.id.radioComplete);
holder.radio_no = (RadioButton)v.findViewById(R.id.radioIncomplete);
holder.master_layout = (LinearLayout)v.findViewById(R.id.master_linlayout);
holder.my_button = (Button)v.findViewById(R.id.btn);
v.setTag(holder);
}else{
holder = (ProgressHolder)v.getTag();
}
final InspectionObject inspectionObject = arrayList.get(position);
holder.my_button.setTag(position);
holder.deficiency_notes.setTag(position);
holder.my_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = (Integer) v.getTag(); //the real and updated position
Log.i("ConfirmAdapter","Button @ position : " + pos);
Log.i("ConfirmAdapter","EditText @ position : " + holder.deficiency_notes.getTag());
}
});
return v;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
ListView lv;
InspectionAdapter inspection_adapter;
ArrayList<InspectionObject> inspectionList;
Boolean eval;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = findViewById(R.id.listView2);
inspectionList = new ArrayList<InspectionObject>();
inspectionList = new ArrayList<InspectionObject>();
inspectionList.add(new InspectionObject(true, "", "Were the floor mopped?"));
inspectionList.add(new InspectionObject(true, "", "Were the mirrors cleaned?"));
inspectionList.add(new InspectionObject(false, "", "Were the toilets cleaned?"));
inspectionList.add(new InspectionObject(true, "", "Was high/low dusting performed?"));
inspection_adapter = new InspectionAdapter(getApplicationContext(), R.layout.inspection_single_row, inspectionList);
lv.setAdapter(inspection_adapter);
}
}
解决方案
编辑: 在这部分
Log.i("ConfirmAdapter","EditText @ position : " + holder.deficiency_notes.getTag())
您仍在引用最后创建的持有者变量。正如我之前所说:在 getView 中,为每个视图创建一个新的 ProgressHolder,并将其分配给持有者变量。因此,每次调用 getView 时都会覆盖持有人。这就是为什么 Log.i 给出你的最后一项。
尝试以下操作:
将新的 ProgressHolder 放在 if 子句中。
if(v == null)
{
holder = new ProgressHolder();
这样,当视图为空时,它只会创建一个新实例。
您可以像这样将其设置为持有人,而不是将按钮的标签设置为位置
holder.my_button.setTag(holder);
您不需要为 EditText 设置标签。
然后在 onClick 中,您通过 getTag() 获取 ProgressHolder 的相应实例,并像这样更改可见性:
holder.my_button.setTag(holder);
holder.my_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ProgressHolder clickedHolder = (ProgressHolder)view.getTag();
clickedHolder.deficiency_notes.setVisibility(View.GONE);
}
});
推荐阅读
- reactjs - 有条件地将具有动态道具名称的布尔道具传递给 React 组件
- android - 如何在 Mac OS 上为 NOX 播放器设置 adb 连接
- python-3.x - 如何访问邻居的边缘
- javascript - 将数据插入表字段
- android - 直接将 openssl 证书与cordova apk 一起使用时,apksigner 失败
- python - 嵌套类装饰器也是描述符类
- ruby - 从 Ruby 执行命令并检索 STDOUT 和 STDERR
- java - 为什么maven为依赖jar下载了一个较短的版本?
- dart - 在 Flutter 中创建具有堆叠列表项的 ListView
- json - 如何解析 JSON 并添加一些自定义字符串?