首页 > 解决方案 > 如何点击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;    
    }

标签: javaandroid

解决方案


问题是您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));

推荐阅读