0

ListViewを実装しました。各要素には、チェックボックスとボタンが含まれています。ビュー用のアダプターを次のように作成しました。

public class myadapter extends SimpleAdapter
{
    LayoutInflater mLayoutInflater;

    public myadapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
    {
        super(context, data, resource, from, to);
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
    {
        View view = null;

        Log.i("xx","getView called: position="+position);

        if (convertView != null)
        {
            view = convertView;
        } 
        else 
        {      
            view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false);
        }

        Button buttonEdit = (Button) view.findViewById(R.id.editbut);
        CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox);

        buttonEdit.setOnClickListener(new OnClickListener()
        {   
            public void onClick(View arg0)
            {
                Log.i("xx","Button pressed! position ="+position);
            }
        });
        cb.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) 
            {
                Log.i("xx","Checkbox changed! position ="+position);
            }
          });

        return super.getView(position, convertView, parent);
    }
}

実行時に、リストの一番上の行にあるボタンをクリックすると、ログ出力に常に「ボタンが押されました!位置=0」が表示されます。同様に、チェックボックスをクリックすると、「チェックボックスが変更されました!position=0」と表示されます。リスト内の他の要素のボタンをクリックすると、問題が発生します。正しいログメッセージが表示されることもありますが、まったく表示されないこともあります。何か案は?

編集:これが私のcustom_row_view.xmlです:

<?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="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="142dp"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
            <TextView android:id="@+id/text1"         
                android:textSize="16sp"         
                android:textStyle="bold" 
                android:textColor="#FFFF00"        
                android:layout_width="match_parent"         
                android:layout_height="fill_parent"/>
            <TextView android:id="@+id/text2"         
                android:textSize="12sp"         
                android:textStyle="bold"      
                android:layout_width="match_parent"         
                android:layout_height="fill_parent"/>
            <TextView android:id="@+id/text3" 
                android:typeface="sans"
                android:textSize="14sp"
                android:textStyle="italic"
                android:layout_width="match_parent" 
                android:layout_height="wrap_content"/>

        </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right" >



    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
                    android:focusable="false"
            android:focusableInTouchMode="false"
        android:text="" />
        <Button
            android:id="@+id/editbut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:text="Edit" />
        </LinearLayout>
    </LinearLayout>



</LinearLayout>
4

3 に答える 3

0

これを行う:

Button buttonEdit = (Button) view.findViewById(R.id.editbut);
          CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox);
          buttonEdit.setTag(String.valueOf(positin));
          cb.setTag(String.valueOf(positin));
          buttonEdit.setOnClickListener(new OnClickListener()
            {   
          public void onClick(View arg0)
           {
           Log.i("xx","Button pressed! position ="+arg0.getTag());
             }
           });
       cb.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
        @Override
        public void onCheckedChanged(CompoundButton arg0, boolean arg1) 
        {
        Log.i("xx","Checkbox changed! position ="+arg0.getTag(););
         }
          });

OnClickListener内部クラスとして()innerを使用しています 。内部クラスの場合、位置の値はゼロのままです。ボタンをsetTag()してから、ボタンからgetTagを取得するまで。

于 2012-07-16T13:54:28.547 に答える
0

convertviewをパラメーターとして使用して、スーパークラス値を返します。

return super.getView(position, convertView, parent);

しかし、あなたはこれをやっています:

if (convertView != null)
    {
        view = convertView;
    } 
    else 
    {      
        view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false);
    }

convertViewがnullの場合、新しいビューを膨らませていますが、それを返していません。

私の提案は

return view;

それ以外の

return super.getView(position, convertView, parent);

それで十分なはずです

于 2012-07-16T13:59:58.503 に答える
0

このようにする

@Override
public View getView(final int position, View convertView, ViewGroup parent) 
{
    View view = convertView;

    Log.i("xx","getView called: position="+position);

    if (view == null)
    {
        view = convertView;             
        view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false);
    }
    Button buttonEdit = (Button) view.findViewById(R.id.editbut);
    CheckBox cb = (CheckBox)view.findViewById(R.id.checkbox);

    return view;
}
于 2012-07-16T13:37:59.613 に答える