2016-10-31 7 views
-1

は、これが私の活動のときにゼロである:ArrayListのsetAdapter

public class HomeTimelineActivity extends AppCompatActivity { 
    private TwitterClient client; 
    Context mContext; 
    @BindView(R.id.rvTweets) 
    RecyclerView rvTweets; 
    List<Tweet> mTweets; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home_timeline); 
Butterknife.bind(this); 
     client = TwitterApplication.getRestClient(); 
     populateTimeline(); 
    } 

    private void populateTimeline() { 
     client.getHomeTimeline(new JsonHttpResponseHandler() { 
      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray jsonArray) { 
       Log.d("DEBUG", jsonArray.toString()); 

       mTweets = new ArrayList<Tweet>(); 

        for (int i = 0; i < jsonArray.length(); i++) { 
         try { 
          JSONObject jsonTweet = jsonArray.getJSONObject(i); 
          Tweet tweet = new Tweet(); 
          tweet.setBody(jsonTweet.getString("text")); 
          tweet.setUid(jsonTweet.getLong("id")); 
          tweet.setCreateAt(jsonTweet.getString("created_at")); 
          JSONObject jsonUser = jsonTweet.getJSONObject("user"); 
          User user = new User(); 
          user.setName(jsonUser.getString("name")); 
          user.setUid(jsonUser.getLong("id")); 
          user.setScreenname(jsonUser.getString("screen_name")); 
          user.setProfileImageurl(jsonUser.getString("profile_image_url")); 
          tweet.setUser(user); 

          mTweets.add(tweet); 

          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            TweetAdapter adapter = new TweetAdapter(mContext, mTweets); 
            rvTweets.setAdapter(adapter); 

            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mContext); 
            rvTweets.setLayoutManager(layoutManager); 

           } 
          }); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
       continue; 
      } 
     } 

    } 


      @Override 
      public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { 
       Log.d("DEBUT", errorResponse.toString()); 
      } 
     }); 
    } 
} 

は、これは私のアダプターです:

public class TweetAdapter extends RecyclerView.Adapter<TweetAdapter.TweetViewHolder>{ 
    private Context mContext; 
    private List<Tweet> mTweets; 

    // Automatically add the Constructor here 

    public TweetAdapter(Context context, List<Tweet> tweets) { 
     mContext = context; 
     mTweets = tweets; 
    } 


    // Implements compulsory methods 

    @Override 
    public TweetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.tweet_list_items, 
       parent, false); 
     TweetViewHolder viewHolder = new TweetViewHolder(view); 

     return viewHolder; 
    } 


    @Override 
    public void onBindViewHolder(TweetViewHolder holder, int position) { 
     holder.bindModel(mTweets.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return mTweets.size(); 
    } 

    public class TweetViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     // Hook the ID to new created Widget using ButterKnife 
     @BindView(R.id.imgUserProfile) 
     ImageView userProfile; 
     @BindView(R.id.tvUserName) 
     TextView userName; 
     @BindView(R.id.tvTweet) 
     TextView tweetText; 

     TweetViewHolder(View view) { 
      super(view); 
      ButterKnife.bind(this, view); 

      // Set the OnclickListener of an item in list 
      itemView.setOnClickListener(this); 
     } 


     void bindModel(Tweet tweet) { 
      // Use the Widget mVar and the model name to set_get info 
      tweetText.setText(tweet.getBody()); 
     } 

     @Override 
     public void onClick(View view) { 
      // Add What happen with OnClick 


     } 
    } 

} 

私はmTweetsリストにアダプタを設定してみてください。私は、アダプタを設定しようとすると、私はgetTweet方法は、サイズが= 25

0 = {[email protected]} 
1 = {[email protected]} 
2 = {[email protected]} 
3 = {[email protected]} 
4 = {[email protected]} 
5 = {[email protected]} 
6 = {[email protected]} 
7 = {[email protected]} 
8 = {[email protected]} 
9 = {[email protected]} 
10 = {[email protected]} 
11 = {[email protected]} 

{5524 @ ArrayListの}十分なオブジェクト ツイート=が戻ったことを確認するために、デバッガを使用し、表示されたいかなるデータやアプリはありません直ちに停止した。不思議なことに、Logcatは情報なしで空白です。それは単に黒です。 Twitterでの認証が成功しました。 誰でも助けてください。

答えて

0

コードのパフォーマンスを向上させて起動させるには、いくつかの手順を実行する必要があります。

欠けている主なものは、ループ内のすべての反復の後にmTweetsを設定していることです。アダプタ全体にリストが設定された後にのみ、mTweetsをmTweetsに設定する必要があります。それに続いて、アダプタをnotifyDataSetChanged()と呼びます。 、あなたのTweetAdapterで

ステップ1

// Class variable adapter... 
private TweetAdapter adapter; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home_timeline); 

     client = TwitterApplication.getRestClient(); 

     // Initially pass null as the mTweets since you don't have any tweets right now... 
     adapter = new TweetAdapter(mContext, null); 
     rvTweets.setAdapter(adapter); 

     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mContext); 

     rvTweets.setLayoutManager(layoutManager); 
     populateTimeline(); 
    } 

ステップ2 をmTweetsのヌルチェックを処理するgetItemCount方法を変更します。

は、これらに従ってください。アダプタに新しいメソッドaddNewTweetsを追加します。

@Override 
    public int getItemCount() { 
     return (mTweets !=null) ? mTweets.size() : 0; 
    } 

    public void setNewTweets(List<Tweet> newTweetList) { 
     this.mTweets = newTweetList; 
    } 

ステップ3 この方法populateTimelineを変更

private void populateTimeline() { 
     client.getHomeTimeline(new JsonHttpResponseHandler() { 
      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray jsonArray) { 
       Log.d("DEBUG", jsonArray.toString()); 

       mTweets = new ArrayList<Tweet>(); 

        for (int i = 0; i < jsonArray.length(); i++) { 
         try { 
          JSONObject jsonTweet = jsonArray.getJSONObject(i); 
          Tweet tweet = new Tweet(); 
          tweet.setBody(jsonTweet.getString("text")); 
          tweet.setUid(jsonTweet.getLong("id")); 
          tweet.setCreateAt(jsonTweet.getString("created_at")); 
          JSONObject jsonUser = jsonTweet.getJSONObject("user"); 
          User user = new User(); 
          user.setName(jsonUser.getString("name")); 
          user.setUid(jsonUser.getLong("id")); 
          user.setScreenname(jsonUser.getString("screen_name")); 
          user.setProfileImageurl(jsonUser.getString("profile_image_url")); 
          tweet.setUser(user); 

          mTweets.add(tweet); 


    /* REMOVE THIS CODE!  
            runOnUiThread(new Runnable() { 
             @Override 
             public void run() { 
              TweetAdapter adapter = new TweetAdapter(mContext, mTweets); 
              rvTweets.setAdapter(adapter); 

              RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mContext); 
              rvTweets.setLayoutManager(layoutManager); 

             } 
            }); 
     */ 

      } catch (JSONException e) { 
       e.printStackTrace(); 
       continue; 
      } 

      // NOW SET MTWEETS IN YOUR ADAPTER. 
      // NOTIFY the adapter that the data is changed. 

      adapter.setNewTweets(mTweets); 
      adapter.notifyDataSetChanged(); 

     } 

    } 
関連する問題