java - 如何点击simpleAdapter listview改变fragment并获取数据?
问题描述
我必须创建一个列表视图,它可以显示两个以上的数据,包括“事件名称”和“日期”。我想单击ActivityFragment
可以更改为的列表视图项目ActivityContentFragment
。实际上,当我点击 listview item 时,错误指出“HashMap cannot be cast”并停止运行应用程序。
活动片段
private void displayArrayList(String jsonStr){
String[] from = {"listView_eventName", "listView_date"};
int[] to = {R.id.listView_eventName, R.id.listView_date};
SimpleAdapter simpleAdapter = new SimpleAdapter(getContext(), convertToWordArrayList(jsonStr), R.layout.listview_activity, from, to);
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ActivityInfo activityInfo =(ActivityInfo) listView.getItemAtPosition(position);
ActivityContentFragment fragment = new ActivityContentFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("eventName", activityInfo.eventName());
fragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
}
});
}
json句柄
private ArrayList<HashMap<String, String>> convertToWordArrayList(String jsonStr){
JSONObject jsonObject ;
ArrayList<HashMap<String, String>> arrayList = new ArrayList<HashMap<String, String>>();
try{
jsonObject = new JSONObject(jsonStr);
JSONArray jsonArray=jsonObject.getJSONArray("article");
for (int i=0;i<jsonArray.length();i++){
JSONObject jsonObjRow=jsonArray.getJSONObject(i);
ActivityInfo activityInfo =new ActivityInfo();
activityInfo.eventName =jsonObjRow.getString("eventName");
activityInfo.date=jsonObjRow.getString("date");
activityInfo.setEventName(jsonObjRow.getString("eventName"));
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("listView_eventName", activityInfo.eventName);
hm.put("listView_date", activityInfo.date);
JSONArray jsonArray2=jsonObjRow.getJSONArray("content");
for (int j=0;j<jsonArray2.length();j++) {
JSONObject jsonObjRow2 = jsonArray2.getJSONObject(j);
activityInfo.review=jsonObjRow2.getString("review");
}
arrayList.add(hm);
}
}catch (JSONException e){
e.printStackTrace();
}
return arrayList;
}
活动信息类
public class ActivityInfo implements Serializable {
public String eventName;
public String date;
public String review;
public void setEventName(String eventName){
this.eventName = eventName;
}
public String getEventName(){
return this.eventName;
}
}
活动内容片段
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_activity_content, container, false);
activityInfo= (ActivityInfo)getArguments().getSerializable("eventName");
TextView textView =(TextView)view.findViewById(R.id.textView);
TextView textView2 =(TextView)view.findViewById(R.id.textView2);
textView.setText(activityInfo.eventName);
textView2.setText(activityInfo.date)
return view;
}
解决方案
问题是您convertToWordArrayList(String jsonStr)
返回 anArrayList<HashMap<String, String>>
但是您将列表中的项目分配给一个变量,该变量是ActivityInfo
. 您不能这样做,您需要将从该函数返回的内容转换为ActivityInfo
.
该列表包含 HashMap。创建一个从 HashMap 返回ActivityInfo
对象的函数:
private ActivityInfo convertHashMapToActivityInfo(HashMap<String, String> map) {
ActivityInfo activityInfo =new ActivityInfo();
activityInfo.eventName = map["listView_eventName"];
activityInfo.date = map["listView_date"];
activityInfo.review = map["listView_review"]; // be aware you're not adding this into the map in your code, so this would return null!!
return activityInfo;
}
然后在你的listView.setOnItemClickListener
你需要这样调用这个函数:
ActivityInfo activityInfo =
convertHashMapToActivityInfo(listView.getItemAtPosition(position));
推荐阅读
- optimization - 优化 Neo4j 查询
- graphql - Gatsby 无法为所有数据库项创建静态页面
- python - 从 Python 中的许多选项中进行选择的干净方法
- python - Python - RobotFramework - 查询结果中没有
- java - 使用 exec-maven-plugin 进行调试
- r - 如何将一个非常大的 .dat 文件拆分为 XML 文件?
- html - 我如何给一个html div位置动态高度
- oracle - 是否有任何存储 Oracle APEX 使用日志的表
- java - 如何将所选电影的数据获取到detailActivity,然后获取到详细活动中的片段?
- python - 从jpg文件恢复灰度图像