3

カスタム リスト アダプターがあります。ここにあります:

public class FilesAdapter extends ArrayAdapter<PutioFileLayout> {

    Context context;
    int layoutResourceId;
    List<PutioFileLayout> data = null;

    public FilesAdapter(Context context, int layoutResourceId, List<PutioFileLayout> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        FileHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new FileHolder();
            holder.textName = (TextView) row.findViewById(R.id.text_fileListName);
            holder.textDescription = (TextView) row.findViewById(R.id.text_fileListDesc);
            holder.imgIcon = (ImageView) row.findViewById(R.id.img_fileIcon);

            row.setTag(holder);
        } else {
            holder = (FileHolder) row.getTag();
        }

        PutioFileLayout file = data.get(position);
        holder.textName.setText(file.name);
        holder.textDescription.setText(file.description);
        holder.imgIcon.setImageResource(file.icon);

        return row;
    }

    static class FileHolder {
        TextView textName;
        TextView textDescription;
        ImageView imgIcon;
    }
}

かなり短くて甘い。Spinner各行のレイアウトに s があり、ユーザーがそれらをクリックして、各項目のコンテキスト メニューを取得できるようにしたいと考えています。これをアダプターに実装するにはどうすればよいですか?

私のrow.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="64dp" >

    <ImageView
        android:id="@+id/img_fileIcon"
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/img_fileIcon"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/text_fileListName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:layout_marginTop="12dp"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="File name"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <FrameLayout
            android:id="@+id/descriptionFrame"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="30dp" >

            <TextView
                android:id="@+id/text_fileListDesc"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="File description" />
        </FrameLayout>
    </LinearLayout>

    <Spinner
        android:id="@+id/item_fileSpinner"
        android:layout_width="44dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:background="@drawable/spinner_background_ab_putio" />

</RelativeLayout>
4

2 に答える 2

2

createContextMenu()を使用できないのはなぜですか?可能であれば、onContextCreate()をオーバーライドして、そこにビューIDを追加してください。

サンプルコードのATMはありませんが、月曜日にオフィスに着いたら持っています。実際、コンテキストメニューはそれを行う最も簡単な方法です。

それから再び、ティムの考えはトリックをしたようです。

編集:月曜日に約束されたように、サンプルコード。

res \ menu\context_menu.xml-この名前は変更できることに注意してください。

<item
    android:id="@+id/context_menu_call"
    android:title="@string/context_menu_call"/>
<item
    android:id="@+id/context_menu_video_call"
    android:title="@string/context_menu_video_call"/>
<item
    android:id="@+id/context_menu_send_im"
    android:title="@string/context_menu_send_im"/>
<item
    android:id="@+id/context_menu_call_number"
    android:title="@string/context_menu_call_number"/>
<item
    android:id="@+id/context_menu_view_profile"
    android:title="@string/context_menu_view_profile"/>

その後、コードで

   @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    switch (v.getId())
    {
        case R.id.listConversations:        //mainContactList from initMainLayoutElements()
            contextList = mainContactList;
            inflater.inflate(R.menu.context_menu, menu);
            break;
        case R.id.listContacts:             //chatContacts from initChatLayoutElements()
            contextList = chatContactList;
            inflater.inflate(R.menu.context_menu, menu);
            break;
        case R.id.listContactsManagement:       //contactList from initContactLayoutElements()
            contextList = contactMgmtList;
            inflater.inflate(R.menu.context_menu, menu);
            break;

        case R.id.btn_sms_settings:
            inflater.inflate(R.menu.sms_menu, menu);
            break;
    }
}

コンテキストメニューを開く方法を定義したので、実際のアイテムの機能を定義する必要があります...

  @Override
public boolean onContextItemSelected(MenuItem item)
{
    item.getMenuInfo();

    switch (item.getItemId())
    {
        case R.id.context_menu_call:
            onCallStartFromContextMenu(false);
            return true;

        case R.id.context_menu_video_call:
            onCallStartFromContextMenu(true);
            return true;

        case R.id.context_menu_send_im:
            layoutState(LayoutState.CHAT);
            Log.d(TAG, "Preparing chat session from context menu for " + getChattersFromList(contextList).toString());
            chatSource = ChatSource.FROM_CONTEXT_MENU;
            prepareChatSessionWith(getChattersFromList(contextList).toArray(new String[getChatterCount(contextList)]));
            return true;

        case R.id.context_menu_call_number:
            Buddy selectedBuddy = (Buddy) contextList.getAdapter().getItem(contextList.getSelectedItemPosition());
            lastCaller = selectedBuddy.toString();
            showAlternateCallDialog(selectedBuddy, !selectedBuddy.getNumberHome().isEmpty(),
                    !selectedBuddy.getNumberMobile().isEmpty(), !selectedBuddy.getNumberOffice().isEmpty());
            return true;

        case R.id.context_menu_view_profile:
            //              Buddy who = buddyAdapter.getItem(listConversations.getSelectedItemPosition());
            Buddy who = (Buddy) contextList.getAdapter().getItem(contextList.getSelectedItemPosition());
            Log.d(TAG, "viewing profile " + who.toString());
            lastProfileName = who.getIdentity();
            showProfileScreen(who);
            return true;
            //transfers

        default:
            contextList = null;
            return super.onContextItemSelected(item);
    }
}

コンポーネントをコンテキストメニューの「リスナー」に登録することを忘れないでください。これらは実際のListView参照です。

    registerForContextMenu(mainContactList);
    registerForContextMenu(chatContactList);

そして最後に、残っているのはアイテムのコンテキストメニューを開くことだけです...

 chatContactList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
    {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
        {
            Log.d(TAG, "chatContacts.onItemLongClick fired!");
            chatContactList.setItemChecked(position, true);
            openContextMenu(chatContactList);
            return true;
        }
    });

  mainContactList.setOnItemLongClickListener(new ListView.OnItemLongClickListener()
    {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
        {
            Log.d(TAG, "mainContactList.onItemLongClick fired!!!");
            mainContactList.setItemChecked(position, true);
            openContextMenu(mainContactList);
            return false;
        }
    });

クリック時に何か(ファイルの選択など)を実行したり、名前の変更や削除などのアクセスの少ない機能をロングクリックで提供したりする可能性があるため、onItemClickedだけでなくLongClickでコンテキストメニューを使用することを好みます

だからあなたは行き​​ます。コンテキストメニューは簡単です;)

于 2012-07-29T03:50:35.550 に答える
2

getView() メソッド内で、次のようにスピナーへの参照を取得します。

Spinner spn = row.findViewById(R.id.item_fileSpinner);

参照を取得したら、すべての値を使用してSpinnerAdapterを作成し、それを次のように設定して、その項目を設定できます。

spn.setAdapater(mSpinAdapter);

スピナーに入力したいデータを教えていただければ、アダプターを作成して入力する方法のより具体的な例を示すことができます。

あとは、次のようにできるOnItemSelectedListenerを設定するだけです。

spn.setOnItemSelectedListner(new OnItemSelectedListener(){

    public void onItemSelected(AdapterView<?> parent, View view, int spnPosition, long id){
        //Do something
    }
});

spnPositiononItemSelected コールバックでの の使用に注意してください。使用するpositionと、getView() パラメータにアクセスできなくなるpositionため、別の名前を使用して、必要に応じて両方またはいずれかにアクセスできるようにします。

于 2012-07-29T03:16:35.000 に答える