如何检索有关在片段列表中单击的项目的信息

时间:2013-09-08 19:15:10

标签: android listview android-listfragment

我想在用户点击listFragment的项目时启动个人资料活动。 该列表显示了有关用户的不同信息,例如:name,id,ranking ...

我正在寻找的方法是访问有关所点击项目的信息,并将列表中所选用户的ID传递给意图。

AsyncTask从服务器检索信息并调用适配器,以便在列表项中显示用户的详细信息。如果我在onListItemClick中使用:

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

日志返回:

  

点击列表项:1内容:{得分= 7540,id = 4,名称= Gepp}

如何在方法中获取id值以向intent添加Extra并启动配置文件活动?

我在参考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);

        }
    }

提出第一个解决方案 来自Emmanuel。

在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内容:总计 - > {score = 0,id = 12,photo =,   name = Beatrice Fratocchi}信息[2]是: 12,照片

其中所需信息为12.

*提出第二个解决方案*

    @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);

    }

3 个答案:

答案 0 :(得分:1)

您可以将o.toString()存储在String变量中(让我们称之为字符串)。然后你可以string.split("=")并将其存储在String[]中(我们称之为stringArray)。与id属性对应的值将存储在stringArray[1]

答案 1 :(得分: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创建为数据对象而不是地图可能更有意义。这样你就可以避免将所有内容存储为字符串。

答案 2 :(得分:0)

我假设您在AsyncTask的某个地方创建了一个适配器,将项目添加到它并在listview中设置它。 ListView类中有一个名为getAdapter()的方法,它返回一个ListAdapter。尝试在onListItemClick中获取该适配器的实例并调用getItem(position),它将返回此列表视图项的用户对象(假设您的适配器实现使用您的UserInfo类填充getView方法中的列表项视图) )