私のアプリには、アイテムが画像、テキスト、および線形レイアウトで構成されるリストビューがあります。カスタム アダプター クラスに onClickListener を実装したいと考えています。リスト内の項目がクリックされると、linearlayout の可視性が Visible または Gone に設定されます。問題は次のとおりです。リスト内のアイテムをクリックしてリストをスクロールすると、他のアイテムの線形レイアウトが表示されます(ビューのリサイクルとすべてのために、私は知っています)。
この問題をどのように解決し、クリックしたアイテムの線形レイアウトのみがスクロール後に必要な可視性を得ることができますか?
onClick イベントなしで、私のアダプター コードは以下のとおりです。
public class myadapter extends ArrayAdapter<lwicon> {
Context context;
lwicon[] iteminarow;
public myadapter(Context context,lwicon[] iteminarow)
{
super(context, R.layout.listitem, iteminarow);
this.context=context;
this.iteminarow=iteminarow;
}
static class ViewHolder
{
public ImageView imageview;
public TextView textview;
public LinearLayout linearlayout;
}
@Override
public View getView(int position,View convertView,ViewGroup parent)
{
ViewHolder holder = null;
if(convertView==null)
{
LayoutInflater LI= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView= LI.inflate(R.layout.listitem, parent, false);
holder = new ViewHolder();
holder.textview=(TextView)convertView.findViewById(R.id.unitname);
holder.imageview=(ImageView)convertView.findViewById(R.id.image);
holder.linearlayout=(LinearLayout)convertView.findViewById(R.id.invisiblablesubitem);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
holder.imageview.setImageResource(iteminarow[position].icon);
holder.textview.setText(iteminarow[position].unitname);
return convertView;
}
}
リスト項目のレイアウトは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
<TextView android:id="@+id/unitname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"/>
</LinearLayout>
<LinearLayout
android:id="@+id/invisiblablesubitem"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
android:visibility="gone">
<TextView android:id="@+id/tt"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="HELLO"/>
</LinearLayout>
</LinearLayout>
更新: Rishabh.CreatioSoft の回答に関して、アダプターを更新しましたが、リストビューの項目をクリックするたびにアプリがクラッシュします。助けてください...
public class myadapter extends ArrayAdapter<lwicon> {
Context context;
lwicon[] iteminarow;
private LayoutInflater inflater;
public myadapter(Context context,lwicon[] iteminarow)
{
super(context, R.layout.listitem, iteminarow);
this.context=context;
this.iteminarow=iteminarow;
inflater = LayoutInflater.from(context);
}
static class ViewHolder
{
public ImageView imageview;
public TextView textview;
public LinearLayout linearlayout;
}
@Override
public View getView(int position,View convertView,ViewGroup parent)
{
lwicon item = (lwicon)this.getItem(position);
ImageView imageView;
TextView textView;
LinearLayout linearLayout;
if(convertView==null)
{
convertView=inflater.inflate(R.layout.listitem, parent,false);
textView=(TextView)convertView.findViewById(R.id.unitname);
imageView=(ImageView)convertView.findViewById(R.id.image);
linearLayout=(LinearLayout)convertView.findViewById(R.id.invisiblablesubitem);
ViewHolder holder = new ViewHolder();
holder.imageview=imageView;
holder.textview=textView;
holder.linearlayout=linearLayout;
convertView.setTag(holder);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
lwicon item1 = (lwicon)v.getTag();
item1.isLLvisible=true;
}
});
}
else
{
ViewHolder holder2=(ViewHolder)convertView.getTag();
textView=holder2.textview;
imageView=holder2.imageview;
linearLayout=holder2.linearlayout;
}
linearLayout.setTag(item);
imageView.setImageResource(item.icon);
textView.setText(item.unitname);
if(item.isLLvisible==true)
linearLayout.setVisibility(View.VISIBLE);
return convertView;
}
}