1

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;

}
4

1 に答える 1

1

私が抱えている問題は、一般的なListViewのリサイクルの問題のようですが、リストをスクロールするときにコメントボックスの内容が保持されないことです。

主な問題は、がの場合にTextViews のみコメントを作成することです。ユーザーがスクロールすると、不要な位置に変更しない最初に設定された行ビュー(コメント付き)が表示されます。コメントループを、チェックするif句の外に移動します。convertViewnullListViewforconvertViewnull

TextViewsまた、リサイクルされた行ビューにはすでに独自のコメントが含まれている可能性があるため、コメントを追加しすぎないように考慮する必要があることは言うまでもなく、そのjson解析をキャッシュすることもできTextViewsます。

于 2012-12-26T16:24:38.250 に答える