我必须创建一个列表视图,该列表视图可以显示包括“ eventName”和“ date”在内的两个以上数据。我想单击ActivityFragment
上的列表视图项,可以将其更改为ActivityContentFragment
。实际上,该错误指出“当我单击列表视图项时,“ HashMap无法强制转换”并停止运行应用程序。
ActivityFragment
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;
}
ActivityInfo类
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;
}
}
ActivityContentFragment
@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;
}
答案 0 :(得分:0)
您应该更改此类型以使类型一致:
private ArrayList<HashMap<String, String>> convertToWordArrayList(String jsonStr){
到
private ArrayList<ActivityInfo> convertToActivityInfoList(String jsonStr){
答案 1 :(得分:0)
问题是您的convertToWordArrayList(String jsonStr)
返回了ArrayList<HashMap<String, String>>
,但是您正在将列表项分配给变量ActivityInfo
。您无法执行此操作,您需要将该函数返回的内容转换为ActivityInfo
。
该列表包含HashMaps。创建一个从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));