1

AlertDialog含む がありListViewます。はListView、customCursor アダプターを介して取り込まれます。内で特定の行を選択済み (Holo テーマで青色で強調表示) に設定できないことを除いて、すべて正常に動作しListViewます。

public AlertDialog m_accountsDialog;

private AlertDialog createAccountSwitcherDialog2()
{
    Cursor listCursor = getDb().getAllListEntries();
    if(listCursor.moveToFirst())
    {
        //Prepare the dialog box
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.strAccounts);

        ListView listView = new ListView(this);
        listView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));

        listView.setAdapter(new AccountsAdapter(this,this,m_ActiveId, listCursor));
        listView.setOnItemClickListener(new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, final long rowId)
            {
                m_accountsDialog.dismiss();
                if(m_ActiveId != (int) rowId)
                {
                    //Do some stuff on click
                }
            }
        });
        builder.setView(listView);
        builder.setPositiveButton(...);
        builder.setNegativeButton(...);

        m_accountsDialog = builder.create();
        m_accountsDialog.setOnShowListener(...);
        m_accountsDialog.show();
    }

    return m_accountsDialog;

}

これは、アラート ダイアログ内にある listView を設定するために使用されるアダプタです。

public class AccountsAdapter extends CursorAdapter
{
    private Context  m_context; /**<Context to which we're bound*/
    private Activity m_activity;
    private boolean  m_isTabletDevice;
    private int      m_ActiveId; // not used now. Can this be used to highlight the row?

   public AccountsAdapter(Context context,Activity activity,int activeId, Cursor cursor)
   {
       super(context, cursor);
       m_context = context;
       m_activity = activity;
       m_isTabletDevice          = isTabletDevice(context);
       m_ActiveId           = activeId;
   }


   @Override
   public void bindView(View rowView,final Context context, Cursor cursor)
   {
       if(rowView == null)
       {
           rowView = newView(context,cursor,null);
       }
       TextView tv = (TextView) rowView.findViewById(R.id.accountName);
       tv.setText(cursor.getString(cursor.getColumnIndex(ProfileDatabase.COLUMN_PROFILENAME)));

      ImageButton editAccountImageButton = (ImageButton) rowView.findViewById(R.id.accountEdit);
           editAccountImageButton.setOnClickListener(new View.OnClickListener() {               
            @Override
            public void onClick(View arg0)
             {
                 Integer activeId = (Integer)arg0.getTag();
                 if(m_activity instanceof MainActivity)
                 {
                     ((MyActivity)m_activity).m_accountsDialog.dismiss();
                     ((MyActivity)m_activity).startEditAccountsActivity(activeId);
                 }

             }
           });
          int accountId = cursor.getInt(cursor.getColumnIndex(ProfileDatabase.COLUMN_ACCOUNT_ID));
          editAccountImageButton.setTag(profileId);
          editAccountImageButton.setFocusable(false);
   }

   @Override
   public View newView(Context context, Cursor cursor, ViewGroup parent)
   {
       //create and return a rowView
   }
}

リスト ビューのカスタム行。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight" >

<ImageButton
    android:id="@+id/accountEdit" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@drawable/option_selector"
    android:src="@drawable/edit_account_button" />
<TextView
    android:id="@+id/accountName" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@id/accountEdit"
    android:bufferType="spannable"
    android:ellipsize="end"
    android:layout_alignParentLeft="true" />

私は試した、

listView.setItemChecked(position, true);
listView.setSelection(position);

アラートダイアログを作成する関数では機能しませんでした。私が持っている他のオプションは、アダプターの行ビューに背景色を手動で設定することですが、テーマはデバイスごとに変わる可能性があるため、もちろんお勧めできません。

事前に感謝し、長い投稿を申し訳ありません.

4

1 に答える 1

1

selector_row.xml以下のような drawable フォルダに作成します。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/Highlight_color" android:state_pressed="true"/>
</selector>

カスタム行のバックグラウンド リソースとして設定します。

于 2013-01-02T06:51:50.943 に答える