我想在用户点击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);
}
答案 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方法中的列表项视图) )