【问题标题】:JSON parsing in ArrayList in ListFragment throwing getApplicationContext() errorListFragment 中 ArrayList 中的 JSON 解析抛出 getApplicationContext() 错误
【发布时间】:2015-12-08 19:54:15
【问题描述】:

我正在开发一个应用程序,它在ListFragment 中显示一些基本的解析 JSON。 我关注了http://www.androidhive.info/2012/01/android-json-parsing-tutorial,它在ListActivity 中运行良好。然后我开始制作自己的应用程序。我在 Android Studio 1.5 中创建了新项目,添加了 Navigation Drawer Activity,因为我有更多的事情要做/显示,并开始将代码重写为片段。除了 getApplicationContext()Cannot resolve method getApplciationContext() 错误的一个疯狂问题仍未解决之外,这基本上很容易。

这是我的片段的一部分:

public class Den1Fragment extends ListFragment {

private ProgressDialog pDialog;

// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";

// contacts JSONArray
JSONArray contacts = null;

// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_den1, container, false);

    contactList = new ArrayList<>();

    ListView lv = getListView();

    // Listview on item click listener
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email))
                    .getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile))
                    .getText().toString();

            // Starting single contact activity
            Intent in = new Intent(getApplicationContext(), // TODO error!
                    SingleContactActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_EMAIL, cost);
            in.putExtra(TAG_PHONE_MOBILE, description);
            startActivity(in);

        }
    });
    // Calling async task to get json
    new GetContacts().execute();
}

如果我添加 Intent in = new Intent(**getActivity().**getApplicationContext(), SingleContactActivity.class); 错误将移动到 contactList = new ArrayList&lt;&gt;(); 并且 Android Studio 不知道如何解决它,甚至谷歌搜索也没有带来太多想要的结果。 我尝试以不同的重写顺序再次执行此操作,发现如果我离开 setContentView(R.layout.activity_main); 而不是将其更改为 return inflater.inflate(R.layout.fragment_den1, container, false);,setContentView 会变为红色,但 contactList 行保持“正常”。

编辑

content_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:id="@+id/content_frame"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main"
tools:context=".MainActivity">

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>

错误报告:

java.lang.RuntimeException: Unable to start activity ComponentInfo{cz.ludato.festapp/cz.ludato.festapp.MainActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
at cz.ludato.festapp.Den1Fragment.onViewCreated(Den1Fragment.java:54)

【问题讨论】:

    标签: android json android-fragments arraylist


    【解决方案1】:

    试试这个代码:

    public class Den1Fragment extends ListFragment {
    
    private ProgressDialog pDialog;
    
    // JSON Node names
    private static final String TAG_CONTACTS = "contacts";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_EMAIL = "email";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_GENDER = "gender";
    private static final String TAG_PHONE = "phone";
    private static final String TAG_PHONE_MOBILE = "mobile";
    private static final String TAG_PHONE_HOME = "home";
    private static final String TAG_PHONE_OFFICE = "office";
    
    // contacts JSONArray
    private JSONArray contacts = null;
    
    // Hashmap for ListView
    private ArrayList<HashMap<String, String>> contactList = new ArrayList<>();;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_den1, container, false);
    ListView lv = getListView();
    
    // Listview on item click listener
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email))
                    .getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile))
                    .getText().toString();
    
            Intent in = new Intent(getActivity(), SingleContactActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_EMAIL, cost);
            in.putExtra(TAG_PHONE_MOBILE, description);
            getActivity().startActivity(in); 
    
        }
    });
    
    // Calling async task to get json
    new GetContacts().execute();
    
    return view;
    }
    

    【讨论】:

    • 酷。但是现在我遇到了非常奇怪的错误。添加了代码 + 错误报告。
    • 尝试将你的ListView的ID替换为android:id="@+id/list"
    • 大声笑。我刚刚意识到我需要将列表视图添加到 fragment_den1.xml
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2021-08-09
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多