java - 单击 ListView 行时如何处理 JSON 的 NULL 结果?

标签 java android json listview asynchronous

对于 Java 的经验很少。我的应用程序可以很好地将数据从 API 提取到 ListView 。单击 ListView 后,我想显示更多详细信息。我的代码位于不同的文件中,当我设置 TextView 文本时,我无法弄清楚如何处理空结果。现在它给了我一些错误。提前谢谢您。我已经尝试调试和我自己的研究一天多了,但没有成功。

我的错误是:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”。

MainActivity.java:

public void showMemberDetailsScreen(int _id) {
    mMembersListScreen.setVisibility(View.GONE);
    mMemberDetailsScreen.setVisibility(View.VISIBLE);

    if (NetworkUtils.isConnected(this)) {
        GetDetailsTask task = new GetDetailsTask(this);
        task.execute(_id);
    } else {
        Log.i(TAG, "onCreate: NOT CONNECTED");
    }
}

/**
 * Populate the member details screen with data.
 * 
 * @param _name
 * @param _birthday
 * @param _gender
 * @param _twitterId
 * @param _numCommittees
 * @param _numRoles
 */
public void populateMemberDetailsScreen(String _name, String _birthday, String _gender, 
        String _twitterId, String _numCommittees, String _numRoles) {

    TextView tv = (TextView)mMembersListScreen.findViewById(R.id.text_name);
    tv.setText(_name);

    tv = (TextView)mMembersListScreen.findViewById(R.id.text_birthday);
    tv.setText(_birthday);

    tv = (TextView)mMembersListScreen.findViewById(R.id.text_gender);
    tv.setText(_gender);

    tv = (TextView)mMembersListScreen.findViewById(R.id.text_twitter_id);
    tv.setText(_twitterId);

    tv = (TextView)mMembersListScreen.findViewById(R.id.text_num_committees);
    tv.setText(_numCommittees);

    tv = (TextView)mMembersListScreen.findViewById(R.id.text_num_roles);
    tv.setText(_numRoles);
}

OnItemClickListener mItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> _parent, View _view, int _position, long _id) {
        // TODO: Show the members detail screen
        Log.i(TAG, "onItemClick: RAN");


        showMemberDetailsScreen(_position);
        Log.i(TAG, "onItemClick: POSITION = " + _position);

    }
};

GetDetailsTask.java:

    private static final String NAME = "name";
private static final String BIRTHDAY = "birthday";
private static final String GENDER = "gender";
private static final String TWITTER_ID = "twitter_id";
private static final String NUM_COMMITTEES = "num_committees";
private static final String NUM_ROLES = "num_roles";

private MainActivity mActivity;

public GetDetailsTask(MainActivity _activity) {
    mActivity = _activity;
}

@Override
protected HashMap<String, String> doInBackground(Integer... _params) {

    // Add member ID to the end of the URL
    String data = NetworkUtils.getNetworkData(API_URL + _params[0]);
    HashMap<String, String> retValues = new HashMap<String, String>();

    try {
        JSONObject response = new JSONObject(data);

        String name = response.optString("name");
        retValues.put(NAME, name);

        String birthday = response.optString("birthday");
        retValues.put(BIRTHDAY, birthday);

        String gender = response.optString("gender_label");
        retValues.put(GENDER, gender);

        String twitterId = response.optString("twitterid");
        retValues.put(TWITTER_ID, twitterId);

        if (response.has("committeeassignments")) {
            JSONArray committeeArray = response.optJSONArray("committeeassignments");
            int numCommittees = committeeArray.length();
            retValues.put(NUM_COMMITTEES, "" + numCommittees);
            Log.i(TAG, "doInBackground: NUM COMMITTESS = " + numCommittees);
        } else {
            retValues.put(NUM_COMMITTEES, "" + 0);
        }

        if (response.has("roles")){
            JSONArray rolesArray = response.optJSONArray("roles");
            int numRoles = rolesArray.length();
            retValues.put(NUM_ROLES, "" + numRoles);
        } else {
            retValues.put(NUM_ROLES, "" + 0);
        }

    } catch(JSONException e) {
        e.printStackTrace();
    }
    return retValues;
}

@Override
protected void onPostExecute(HashMap<String, String> _result) {
    super.onPostExecute(_result);
    if (_result != null) {
        String name = _result.get(NAME);
        String birthday = _result.get(BIRTHDAY);
        String gender = _result.get(GENDER);
        String twitterId = _result.get(TWITTER_ID);
        String numCommittees = _result.get(NUM_COMMITTEES);
        String numRoles = _result.get(NUM_ROLES);

        mActivity.populateMemberDetailsScreen(name, birthday, gender, twitterId, numCommittees, numRoles);
    }
}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/members_list_screen"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:visibility="gone" >

    <ListView
        android:id="@+id/members_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

<LinearLayout
    android:id="@+id/member_details_screen"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:visibility="gone" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/name" />

        <TextView
            android:id="@+id/text_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/birthday" />

        <TextView android:id="@+id/text_birthday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/gender" />

        <TextView
            android:id="@+id/text_gender"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/twitter_id" />

        <TextView android:id="@+id/text_twitter_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/num_committees" />

        <TextView
            android:id="@+id/text_num_committees"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/name" />

        <TextView
            android:id="@+id/text_num_roles"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>
</LinearLayout>

最佳答案

您正在尝试显示详细信息屏幕,但在您的方法中,当您应该使用mMemberDetailsS​​creen时,您会在mMembersListScreen下找到按ID查看的内容。试试这个:

public void populateMemberDetailsScreen(String _name, String _birthday, String _gender, 
    String _twitterId, String _numCommittees, String _numRoles) {

    TextView tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_name);
    tv.setText(_name);

    tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_birthday);
    tv.setText(_birthday);

    tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_gender);
    tv.setText(_gender);

    tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_twitter_id);
    tv.setText(_twitterId);

    tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_num_committees);
    tv.setText(_numCommittees);

    tv = (TextView) mMemberDetailsScreen.findViewById(R.id.text_num_roles);
    tv.setText(_numRoles);
}

关于java - 单击 ListView 行时如何处理 JSON 的 NULL 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40166574/

相关文章:

c# - JToken.ToObject<T>() 与 JToken.Value<T>() 之间的区别

Perl JSON 模块 |无法获得 JSON 响应

java - 如何使用 openCV 或 OCR tesseract 从图像中提取文本?

java - Hibernate 和 Mysql 结果不匹配

java - Retrofit - JSON 数组解析

c# - 使用 JSON.NET 反序列化 C# 中类中缺少默认构造函数的 json

java - 跨 dao 方法使用 session 对象 UserBean

java - 共享首选项不需要创建吗?

java - Android 中的 DialogFragment 错误

android - Sencha Touch/Cordova - Android - 使用 Android Studio 构建 APK