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 のコードは単なるゲッターとセッターです。