0

我有一个名为的列表statusses,其中包含所需的文本,即名为 的推文status。我想将状态设置为listview

public class MainActivity extends Activity {

    ListView i;
    List<Status> statusess;
    ConfigurationBuilder cb;
    twitter4j.Status status3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        i = (ListView) findViewById(R.id.listView1);

        new LongOperation().execute("");

        }

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {

        TwitterFactory tf = new TwitterFactory(cb.build());
        Twitter twitter = tf.getInstance();

        String[] srch = new String[] {"Obama"};
        ResponseList<User> users = null;
        try {
            users = twitter.lookupUsers(srch);
        } catch (TwitterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (User user : users) {
          System.out.println("Friend's Name " + user.getName()); // this print my friends name
              if (user.getStatus() != null) 
              {
              System.out.println("Friend timeline");
              try {
                statusess = twitter.getUserTimeline(user.getName());
            } catch (TwitterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
              for (twitter4j.Status status3 : statusess) 
               {
                      System.out.println(status3.getText());
               }
              }
        }  


            return null;
    }        

    @Override
    protected void onPostExecute(String result) {    

    }

    @Override
    protected void onPreExecute() { 
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

现在这 System.out.println(status3.getText());100% 有效,推文显示在console. 但我如何让他们listview进入onPostExecute

我试过了

i.setAdapter(new ArrayAdapter<twitter4j.Status>(MainActivity.this,
        android.R.layout.simple_list_item_1, statusess));

但是我得到了很多不需要的文本,我只需要状态3,它是文本(推文),它显示了很多东西,比如推文 ID、转发、关注者等。

我也试过这个

@Override
protected void onPostExecute(String result) {    
    for (twitter4j.Status status3 : statusess) 
    {
    i.setAdapter(new ArrayAdapter<statusess>(MainActivity.this,
            android.R.layout.simple_list_item_1, status3.getText()));
    }
}

但是没用,很多红线xD

4

2 回答 2

2
users = twitter.lookupUsers(srch);

这为您提供了用户列表。您正在运行一个 for 循环来遍历列表,并statuses在每次迭代时进行更改。当 for 循环结束时,保存最后一个用户statuses的状态列表(由 返回twitter.getUserTimeline(user.getName())) 。这真的是你想要的吗?

例如,您可以twitter.lookupUsers(srch)在 ListView 中显示使用 , 返回的用户列表。并且,在项目单击事件中,显示该用户的状态列表

确定user需要状态列表的对象后,请执行以下操作:

// Declare an ArrayList with class scope
ArrayList<String> statusListTextOnly;

// Initialize it in doInBackground()
@Override
protected String doInBackground(String... params) {
    ....
    ....
    statusListTextOnly = new ArrayList<String>();

    // Initialize 'statuses' for the user that you have decided on
    statusess = twitter.getUserTimeline(user.getName());

    // Run a for-loop to fill 'statusListTextOnly'
    // We will use 'statusListTextOnly' with the ArrayAdapter
    for (twitter4j.Status status3 : statusess) {
        statusListTextOnly.add(status3.getText());
    }
}

// Initialize/reset ArrayAdapter
@Override
protected void onPostExecute(String result) {
    i.setAdapter(new ArrayAdapter<String>(MainActivity.this,
    android.R.layout.simple_list_item_1, statusListTextOnly));
}

您的代码的问题在于:

i.setAdapter(new ArrayAdapter<twitter4j.Status>(MainActivity.this,
    android.R.layout.simple_list_item_1, statusess));

toString()使用该方法显示传递给 ArrayAdapter 的对象。现在,toString()它主要被自定义对象覆盖,并用于提供对对象本身的有意义的描述。它可以被覆盖以提供字符串格式的任何类型的信息。在Status对象的情况下,toString()返回比您需要的多一点。因此,我们使用提取相关信息Status#getText()并将其存储在单独的 ArrayList 中。

您的第二次尝试也有问题:

@Override
protected void onPostExecute(String result) {    
    for (twitter4j.Status status3 : statusess) {
        i.setAdapter(new ArrayAdapter<statusess>(MainActivity.this,
            android.R.layout.simple_list_item_1, status3.getText()));
    }
}

在这里,您将 ArrayAdapter 的泛型参数设置为一个变量('statuses'):泛型参数应该是一个类。接下来,您将 aString作为最后一个参数传递,而 ArrayAdapter 的构造函数可以采用对象数组或 ArrayList。第三,您正在创建 ArrayAdapter 的新实例,并在 for 循环的每次迭代中将其设置为 ListView。这在逻辑上是不正确的。您需要一个 ArrayAdapter 实例,并且只需要设置一次。

你还能做什么:

  • 创建一个提供新功能的自定义 ArrayAdapter,例如:显示图像和文本。

  • 深入了解 BaseAdapter:高度可定制的通用适配器。

于 2013-11-13T16:35:16.120 回答
2
package com.example.twitterdemo;

import java.util.List;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

public final class GetTimeLines {
    *//**
     * Usage: java twitter4j.examples.GetTimelines ID Password
     * @param args String[]
     *//*
    public static void main(String[] args) {

        Twitter unauthenticatedTwitter = new TwitterFactory()
                .getInstance();
        System.out.println("Showing public timeline.");
        try {
            List<Status> statuses = unauthenticatedTwitter
                    .getUserTimeline();
            for (Status status : statuses) {
                System.out.println(status.getUser().getName() + ":"
                        + status.getText());
            }
            if (args.length < 2) {
                System.out
                        .println("You need to specify TwitterID/Password combination to show UserTimelines.");
                System.out
                        .println("Usage: java twitter4j.examples.GetTimelines ID Password");
                System.exit(0);
            }

            // Other methods require authentication
            Twitter twitter = new TwitterFactory().getInstance();
            statuses = twitter.getUserTimeline();
            System.out.println("------------------------------");
            System.out.println("Showing " + args[0]
                    + "'s friends timeline.");
            for (Status status : statuses) {
                System.out.println(status.getUser().getName() + ":"
                        + status.getText());
            }
            statuses = twitter.getUserTimeline();
            System.out.println("------------------------------");
            System.out.println("Showing " + args[0] + "'s timeline.");
            for (Status status : statuses) {
                System.out.println(status.getUser().getName() + ":"
                        + status.getText());
            }
            Status status = twitter.showStatus(81642112l);
            System.out.println("------------------------------");
            System.out.println("Showing " + status.getUser().getName()
                    + "'s status updated at " + status.getCreatedAt());
            System.out.println(status.getText());
            System.exit(0);
        } catch (TwitterException te) {
            System.out.println("Failed to get timeline: "
                    + te.getMessage());
            System.exit(-1);
        }
    }
}
于 2013-11-13T09:15:49.093 回答