0

ユーザーが listFragment の項目をクリックしたときにプロファイル アクティビティを開始したいと考えています。リストには、名前、ID、ランキングなど、ユーザーに関するさまざまな情報が表示されます...

私が探しているのは、クリックされたアイテムに関する情報にアクセスし、リストで選択されたユーザーの ID をインテントに渡す方法です。

AsyncTask はサーバーから情報を取得し、アダプターを呼び出して、リスト項目にユーザーの詳細を表示します。onListItemClick で使用する場合:

    Object o=(Object)getListView().getItemAtPosition(position);
    Log.e("LikeAttend Report", "Clicked list item: " + position + " Content: " + o.toString());

ログは次を返します。

クリックされたリスト項目: 1 コンテンツ: {score=7540, id=4, name= Gepp}

メソッド内で id 値を取得してインテントにエクストラを追加し、プロファイル アクティビティを開始するにはどうすればよいですか?

リファレンスhttp://developer.android.com/reference/java/lang/Object.htmlに役立つものは何も見つかりませんでした

コード:

これは私がこれまでに試したことです:

public static class LikeFragmentList extends ListFragment 
    {
        private ListView listLike;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            View likeView = inflater.inflate(R.layout.likelist, container, false);
            ProgressBar progress = (ProgressBar) likeView.findViewById(R.id.loading_spinner_like);
            String tabSocial="like";
            listLike = (ListView) likeView.findViewById(android.R.id.list);
            /*
             *  The asyncTask retrieves infos about the user list
             */
            new AsyncLoadSocial(getActivity(), progress, listLike).execute(uid,tabSocial);
            return likeView;

        }

        @Override
        public void onListItemClick(ListView listView, View view, int position, long id) 
        {
            super.onListItemClick (listView, view, position, id);
            // I've tried with object and cursor
            Object o = (Object) getListView().getItem(position);
            //Cursor cursor = (Cursor) getListAdapter().getItem(position); NullPointerException
            Log.e("LikeAttend Report", "Clicked list item: " + position + " Content: " +o.toString());

            Intent intent = new Intent(getActivity(), Profile.class);
            //intent.putExtra("id", o.toString(0)); NullPointerException
            getActivity().startActivity(intent);

        }
    }

エマニュエルから提案された最初のソリューション。

ListFragmentList で:

@Override
            public void onListItemClick(ListView listView, View view, int position, long id) 
            {
                super.onListItemClick (listView, view, position, id);
                String infos = getListView().getItemAtPosition(position).toString();
                String[] info = infos.split("=");
                Log.e("LikeAttend Report", "Clicked list item: " + position + " Content: total -> " + infos + " \n Info[2] is:" + info[2]);

                Intent intent = new Intent(getActivity(), Profile.class);
                //intent.putExtra("id", o.toString(0));
                getActivity().startActivity(intent);

            }

ログは次を返します。

クリックされたリスト項目: 2 内容: 合計 -> {スコア=0, id=12, 写真=, 名前=Beatrice Fratocchi} 情報[2] は: 12, 写真

必要な情報は 12 です。

* 提案された 2 番目のソリューション *

    @SuppressWarnings("unchecked")
    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) 
    {
        super.onListItemClick (listView, view, position, id);

        HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
        Log.e("LikeAttend Report", "Clicked list item: " + position +" Content: \n" + map.get(TAG_ID).toString());

        Intent intent = new Intent(getActivity(), Profile.class);
        intent.putExtra("id", map.get(TAG_ID));
        getActivity().startActivity(intent);

    }
4

3 に答える 3

1

getItemAtPosition()結果のオブジェクトを、アダプターに入力しているものにキャストするだけでよいはずです。見た目からして、それはHashMap<String, String>. したがって、次のことを試してください。

HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);

その後、マップの入力に使用しているのと同じキーを使用して、個々の値を取得できます。

String id = map.put(TAG_ID,id);
String score = map.put(TAG_SCORE, score);
String name = map.put(TAG_NAME, name);
String photo = map.put(TAG_PHOTO, photo);

単純な POJO をマップではなくデータ オブジェクトとして作成する方が理にかなっているかもしれません。そうすれば、すべてを文字列として保存する必要がなくなります。

于 2013-09-08T19:40:30.283 に答える