如何单击simpleAdapter列表视图以更改片段并获取数据?

时间:2019-02-14 09:44:36

标签: java android

我必须创建一个列表视图,该列表视图可以显示包括“ 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;    
    }

2 个答案:

答案 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));