2012-01-02 9 views
1

リストビューとテーブルビューを使用してFacebookのフィードを開発しようとしています。各行には、リストビューにコメントを含むフィードポストがあります。フィードのデータオブジェクトを配列リストに格納しています。私はそれがAのだから、テーブルレイアウトリストビューでのitemviewのテーブルレイアウトandroidパフォーマンス

に追加することができるように、私はコメントのレイアウトを膨らまいaddcomments機能で再びこの

public View getView(final int position, View convertView, ViewGroup parent) { 
    feedItem = FeedItems.get(position); 

    convertView = layoutInflater.inflate(R.layout.feed_main, null); 
    TableLayout mainFeedLayout = (TableLayout) convertView 
     .findViewById(R.id.blogFeedTableLayout); 

    TextView displayName = (TextView) convertView 
       .findViewById(R.id.feed_username); 
    TextView description = (TextView) convertView 
        .findViewById(R.id.comment_text); 

    // Set the text to the texview 
     . 
     . 
     . 

    // Adding comments to the feed 
    for (int i = 0; i < feedItem.feedComments.size(); i++) { 
     mainFeedLayout .addView(addComment(
     convertView, feedItem.feedComments.get(i))); 
    } 

    } 

のようにやっている私のgetビューで

class FeedPost{ 
    String username; 
    String imageUrl; 
    String feedpostText; 
    ArrayList<Comment> comments;} 

1つのフィードをリストビューに表示するには、各フィード項目のコメントをチェックしてフィードに表示しています。これは本当に痛いし、遅いです。

レイアウトの代わりにスタティックホルダーを使用してみましたが、毎回膨らませてみました。また、それはまた動作しませんでした。 mulitple異なるビューがある場合、私は "SackOfViewsAdapter"のcommonsguyを試してみました。しかし、実際それは異なった意見ではありません。

facebookはwebviewを使い、ユーザーのフィードを表示するためにhtmlを表示すると思います。アンドロイドのネイティブレイアウトとコードを使用して同じことを行う最善の方法は何ですか?この種の複雑なデータを表示するための最良の方法を提案するのに手伝ってください。

+0

リサイクルの見解はとにかく速くなければなりません。クラスをArrayAddapter として拡張し、可能な限り多くのビューをリサイクルしました。 – Dante

+0

テーブルのレイアウトはコンテンツによって異なるため、リサイクルは難しいです。 Facebookのフィードビューを検討してください。フィードごとのコメントは投稿ごとに異なるので、私が信じているビューをリサイクルするのは簡単ではありません。助言がありますか? – Madjokr

+0

あなたは間違っている、あなたはたくさんリサイクルすることができます。これで、すべてのリスト項目に対してTextViewsをインスタンス化する必要があります。リサイクルする場合は、すべてのリスト項目のテキストを設定するだけです。リサイクルについてもう少し詳しくお読みになり、デバッグ中にどのように動作するかをご覧ください。 – Dante

答えて

1

これは私の実装です。私はたくさんのビューを削除しましたが、イグニッション/ドロイドフーからのリモートイメージビューをどのようにリサイクルできるかを示したかっただけです。

public class DealAdapter extends ArrayAdapter<DealObject> { 

private Context mContext; 
private Activity mActivity; 
private ArrayList<DealObject> mItems; 
private int mXmlId; 

public DealAdapter(Context context, int textViewResourceId, ArrayList<DealObject> items, Activity activity) { 
super(context, textViewResourceId, items); 
this.mContext = context.getApplicationContext(); 
this.mActivity = activity; 
this.mItems = items; 
this.mXmlId = textViewResourceId; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
//View v = null; 
View v = convertView; 
ViewHolder holder = null; 
RemoteImageLoader imageLoader = new RemoteImageLoader(mContext, true); 
RemoteImageView dealImage = null; 

DealObject mo = mItems.get(position); 
try { 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(mXmlId, null); 
     holder = new ViewHolder(); 

     dealImage = (RemoteImageView) v.findViewById(R.id.deal_image); 

     holder.dealImage = dealImage; 
     v.setTag(holder); 
    } else { 
     // Get the ViewHolder back to get fast access to the ImageView. 
     holder = (ViewHolder) convertView.getTag(); 
     holder.dealImage.setBackgroundColor(Color.WHITE); 
     dealImage = holder.dealImage; 
    } 

    if(mo.getImage() != null){ 
     // calling reset is important to prevent old images from displaying in a recycled view. 
     dealImage.reset(); 
     holder.dealImage.setImageUrl(imageUrl); 
     try { 
      holder.dealImage.loadImage(); 
     } 
      catch (Exception ex) { 
     } 
    } 
} 
catch (Exception ex) { 
    ex.printStackTrace(); 
} 
    return v; 
} 

private static final class ViewHolder { 
    private RemoteImageView dealImage; 
} 
0

2つのこと:ビューを使用し、フィードを読み込むためにAsynctaskを作成します(フィードとタスクをforに移動します)。そうすれば、あなたはUIスレッドを詰まらせることはありません。

私は簡単にそのビューを再利用するために注文します。このような何か:asynctaskについては

if (convertView == null) { 
      row = (LinearLayout) LayoutInflater.from(this.context).inflate(R.layout.account, parent, false); 
      } else { 
      row = (LinearLayout) convertView; 
      } 

、私はあなたがasynctaskに更新して行われたときにタスクがビューを更新できるようにしたいビューを渡します。

+0

テーブルビューのコメントが変更されるため、リサイクルビューは使用できません。ブログフィードは1つ以上のコメントを持つことができます。ビューをリサイクルすると、不一致のコメントとビューがすべて表示されます。リサイクルの詳細を教えてください。 – Madjokr

+0

スクロールすると、情報を更新しなくても、ビューは何度か更新されます。デバッグを試みると、getViewが何度か呼び出されます。 – sfratini