JSONArray (Facebook リクエストから) を取得するカスタム アダプターで ListView を使用しています。各 ListView アイテムには、投稿の種類に応じて、2 つの TextView と 1 つまたは 2 つの ImageView があります。各リスト項目には、「コメント ボックス」と呼んでいる LinearLayout もあります。
xml でリスト項目を定義すると、コメント ボックスにはタイトル (「コメントといいね」) の TextView のみが含まれます。カスタム アダプターでは、コメント データを解析し (正しいことを願っています)、コメントごとにプログラムで TextView を追加します。
私が抱えている問題は、一般的な ListView リサイクルの問題のように思えますが、リストをスクロールするときにコメント ボックスの内容が保持されないことです。JSONデータを調べたところ、配列内のすべてのオブジェクトに「コメント」用の同じフィールドがあるため、特に他のすべてのデータが完全に正常にロードおよび入力された場合、データ内の何かに対してnullを取得しているとは思いません. これ以外はすべて機能するため、何が間違っているのかわかりません。これが私のアダプターの getView() メソッドです。
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
try {
jsonObject = getItem(position);
jsonFrom = jsonObject.getJSONObject("from");
postType = jsonObject.getString("type");
posterName = jsonFrom.getString("name");
posterID = jsonFrom.getString("id");
posterPhoto = "http://graph.facebook.com/" + posterID + "/picture?type=square";
if (jsonObject.has("name")) {
posterMessage = jsonObject.getString("name");
}
else if (jsonObject.has("story")){
posterMessage = jsonObject.getString("story");
}
else if (jsonObject.has("message")){
posterMessage = jsonObject.getString("message");
}
else{
posterMessage = "No message.";
}
if(jsonObject.has("picture")){
posterImageURL = jsonObject.getString("picture");
}
commentsData = jsonObject.getJSONObject("comments");
commentsCount = commentsData.getInt("count");
} catch (JSONException e) {
e.printStackTrace();
}
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.post_holder,null);
holder = new ViewHolder();
holder.posterName = (TextView) convertView.findViewById(R.id.posterName);
holder.posterMessage = (TextView) convertView.findViewById(R.id.posterMessage);
holder.posterProfilePhoto = (ImageView) convertView.findViewById(R.id.posterProfilePic);
holder.posterImage = (ImageView) convertView.findViewById(R.id.posterImage);
holder.commentsBox = (LinearLayout) convertView.findViewById(R.id.commentsBox);
if(postType.equals("photo")){
holder.posterImage.setVisibility(View.VISIBLE);
}
if(commentsCount!=0 && commentsCount!=null){
try {
commentsArray = commentsData.getJSONArray("data");
for(int index = 0; index<commentsArray.length(); index++){
comment = commentsArray.getJSONObject(index);
commenterName = comment.getJSONObject("from").getString("name");
commenterId = comment.getJSONObject("from").getString("id");
commentMessage = comment.getString("message");
TextView commentMessageHolder = new TextView(activity);
commentMessageHolder.setText(Html.fromHtml("<b>"+commenterName+"</b>"+" "+commentMessage));
holder.commentsBox.addView(commentMessageHolder, index+1);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
if(postType.equals("photo")){
holder.posterImage.setVisibility(View.VISIBLE);
}
else{
holder.posterImage.setVisibility(View.GONE);
}
}
if (jsonObject != null) {
holder.posterName.setText(posterName);
if (posterMessage != null) {
holder.posterMessage.setText(posterMessage);
} else {
holder.posterMessage.setText("No message for this post.");
}
imageLoader.displayImage(posterPhoto,holder.posterProfilePhoto);
if(postType.equals("photo")){
if(posterImageURL != null){
holder.posterImage.setTag(posterImageURL);
imageLoader.displayImage(posterImageURL, holder.posterImage);
}
}
}
return convertView;
}