我有一个列表视图和 ArrayAdapter 的问题。我的目标是在每一行上都有一个按钮,允许用户隐藏(或显示)该行中包含的 TextView。
但是当我测试我的代码时,如果我单击第一行的按钮,它会隐藏第一个 TextView 以及下面的另一个 TextView 9 行。
我想这是正常的回收机制操作,但我并没有真正理解它,因为我假设在 onClick 方法上, View 参数是唯一的。
适配器测试.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:padding="5dip">
<ImageButton
android:id="@+id/adapter_test_button_showhide"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_action_pause_light">
</ImageButton>
<!-- label -->
<TextView android:id="@+id/adapter_test_text_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf ="@id/adapter_test_button_showhide">
</TextView>
</RelativeLayout>
AdapterTest.java
public class AdapterTest extends ArrayAdapter<String>
{
// Holder
static class ViewHolder {TextView txtLabel ; ImageButton btnShowHide;}
//Initialize adapter
public AdapterTest(Context context, int resource, List<String> items) {super(context, resource, items);}
@Override
public View getView(int position, View v, ViewGroup parent)
{
// view Holder
ViewHolder viewHolder;
//Inflate the view
if(v==null)
{
//linearView = new LinearLayout(getContext());
LayoutInflater li = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.adapter_test, null);
// Create holder
viewHolder = new ViewHolder();
viewHolder.txtLabel = (TextView)v.findViewById(R.id.adapter_test_text_label);
viewHolder.btnShowHide = (ImageButton)v.findViewById(R.id.adapter_test_button_showhide);
v.setTag(viewHolder);
}
else
{
viewHolder = (ViewHolder) v.getTag();
}
// Load screen with data;
LoadScreenFromItem (viewHolder,getItem(position));
return v;
}
public void LoadScreenFromItem(ViewHolder viewHolder, String item)
{
// Remove handler
viewHolder.btnShowHide.setOnClickListener(null);
// Add handler
viewHolder.btnShowHide.setOnClickListener(handleOnClickShowHide());
// Set textt
viewHolder.txtLabel.setText(item);
}
private View.OnClickListener handleOnClickShowHide()
{
return new View.OnClickListener()
{
public void onClick(View v)
{
View parent = (View)v.getParent();
TextView listserie = (TextView) parent.findViewById(R.id.adapter_test_text_label);
// hide or show label
if (listserie.isShown()) listserie.setVisibility(View.INVISIBLE);
else listserie.setVisibility(View.VISIBLE);
}
};
}
}
问题 :
我的问题是:有没有办法做我想做的事?