2

ListView を含む従来の ListFragment があります (レイアウトが膨張していません)。JSONを介してサーバーから「ユーザーのデータ」をUsers.classの単純なリストにダウンロードしています。カスタムアダプターにダウンロードしたデータを入力したいのですが、うまくいきません...ダウンロードは問題ありません。ユーザーでいっぱいのUsers.classがありますが、AsyncTaksのonPostExecute()メソッドから渡してアダプターを作成して表示すると、getView()メソッドは呼んだことはありません。getCount() および getId() メソッドを実装しました。getView() を手動で呼び出すと、 convertView オブジェクトは膨張したレイアウトとデータで問題ないように見えます....何が間違っていますか? ご協力ありがとう御座います。

次のようにコーディングします: Users.class

public class Users {

private List<User> listOfUsers;

public Users() {
    listOfUsers = new ArrayList<User>();
}

public void putUser(User user) {
    this.listOfUsers.add(user);
}

public List<User> getUsers() {
    return this.listOfUsers;
}

public void setUsers(List<User> users) {
    this.listOfUsers = users;
}

public int getUsersCount() {
    return this.listOfUsers.size();
}

public long getUserId(int pos) {
    return this.listOfUsers.get(pos).getId();
}

}

AsyncTask のコードは次のとおりです。

public class GetUsers extends AsyncTask<Void, Long, Users> {

interface GetUsersIFace {
    void setAdapter(Users users);
}

private static String TAG = "GetUsers.class";

private Context context;
private GetUsersIFace fragment;

public GetUsers(Context context, GetUsersIFace fragment) {
    super();
    this.context = context;
    try {
        this.fragment = fragment;
    } catch (ClassCastException e) {
        Log.d(TAG, e.getMessage());
    }
}

@Override
protected Users doInBackground(Void... unused) {
    try {
        if (isOnline()) {
            InputStream input;
            if ((input = getInputStream()) != null) {
                return getJSON(input);
            }
        }
    } catch (IOException e) {
        Log.d(TAG, "Error while reading from server.");
        Log.d(TAG, e.getMessage());
    } catch (NullPointerException e) {
        Log.d(TAG, "Server not responding.");
        Log.d(TAG, e.getMessage());
    } catch (Exception e) {
        Log.d(TAG, "Uknown issue.");
        Log.d(TAG, e.getMessage());

    }
    return null;
}

@Override
protected void onPostExecute(Users users) {
    fragment.setAdapter(users);

}

public boolean isOnline() throws NullPointerException {
    ConnectivityManager mConnManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = mConnManager.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    } else {
        return false;
    }
}

private InputStream getInputStream() throws IOException {
    URL url = new URL("http://192.168.0.20/test.json");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    InputStream input = new BufferedInputStream(con.getInputStream());
    return input;
}

private Users getJSON(InputStream input) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        InputStreamReader reader = new InputStreamReader(input);
        Users users = mapper.readValue(reader, Users.class);
        return users;
    } catch (JsonParseException e) {
        Log.d(TAG, e.getMessage());
    } catch (JsonMappingException e) {
        Log.d(TAG, e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
    }
    return null;
}

}

ListFragment のコードは次のとおりです。

public class UsersListFragment extends ListFragment implements GetUsersIFace {

ListView mListView;
ArrayAdapter<User> mAdapter;
Activity attachedActivity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.attachedActivity = activity;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mListView = getListView();
    GetUsers task = new GetUsers(attachedActivity, this);
    task.execute();
}

static class UserAdapter extends ArrayAdapter<User> {

    private static class ViewHolder {
        TextView name, occupation, age;
        ImageView userimage;
    }

    LayoutInflater inflater;
    Users users;

    public UserAdapter(Context context, Users users) {
        super(context, R.layout.userslist_item);
        this.users = users;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            ViewHolder holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.userslist_item, parent,
                    false);
            holder.name = (TextView) convertView
                    .findViewById(R.id.username);
            holder.occupation = (TextView) convertView
                    .findViewById(R.id.useroccupation);
            holder.age = (TextView) convertView.findViewById(R.id.userage);
            holder.userimage = (ImageView) convertView
                    .findViewById(R.id.userfoto);
            convertView.setTag(holder);
        }
        ViewHolder holder = (ViewHolder) convertView.getTag();
        User user = users.getUsers().get(position);

        holder.name.setText(user.getName().toString());
        holder.occupation.setText(user.getOccupation());
        holder.age.setText(String.valueOf(user.getAge()));
        return convertView;
    }

    @Override
    public int getCount() {
        return users.getUsersCount();
    }

    @Override
    public long getItemId(int pos) {
        return users.getUserId(pos);
    }

}

public void setAdapter(Users users) {
    mAdapter = new UserAdapter(attachedActivity, users);
    setListAdapter(mAdapter);
    mAdapter.notifyDataSetChanged();
}

}

User.class のコードは単なるゲッターとセッターです。

4

0 に答える 0