【问题标题】:List view doesn't show text列表视图不显示文本
【发布时间】:2013-06-05 10:16:34
【问题描述】:

我需要从一个在新线程中完成的网站获取文本。然后我需要将该文本放在列表视图中。 问题是我无法为列表视图设置数组适配器,直到将文本放入该适配器中使用的列表中。列表填写在用于连接网站的线程中。

我试图通过在第一个线程运行的新线程中设置适配器来解决这个问题。程序启动时没有错误,但列表视图中没有显示任何内容。

我正在使用来自此站点的列表视图代码http://www.vogella.com/articles/AndroidListView/article.html

我是 java 和 android 的新手,所以我希望你明白我想要做什么:)

代码如下

    package com.example.studentservis;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;

    import android.R.string;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.view.Menu;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;

    public class MainActivity extends Activity  {

        String s;
        List<String> headersList = new ArrayList<String>();
        List<String> contentList = new ArrayList<String>();
        ListView listview;
        StableArrayAdapter adapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main); 

            listview = (ListView) findViewById(R.id.listView1);
            threadStart();

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }


        public void adapterInit()
        {
            adapter = new StableArrayAdapter(this, android.R.layout.simple_list_item_1, headersList);
            listview.setAdapter(adapter);
        }

        private class StableArrayAdapter extends ArrayAdapter<String>{

            HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

            public StableArrayAdapter(Context context, int textViewResourceId,
                    List<String> objects) {
                super(context, textViewResourceId, objects);
                // TODO Auto-generated constructor stub
                for (int i = 0; i < objects.size(); ++i) {
                    mIdMap.put(objects.get(i), i);
                }
            }

            @Override
            public long getItemId(int position) {
                String item = getItem(position);
                return mIdMap.get(item);
            }

            @Override
            public boolean hasStableIds() {
                return true;
            }
        }

        public void threadStart()
        {
            //txtView.setText(stringHandler.getString());
            new Thread(new Runnable() {  // thread
                public void run(){

                    try 
                    {
                        webRequest();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    new Runnable()
                    {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            adapterInit();
                        }

                    };
                }
            }).start();
        }

        public void webRequest() throws Exception{
            String servisURL = "http://www.sczg.unizg.hr/student-servis/";
            Document doc = Jsoup.connect(servisURL).get();

            Elements jobNode = doc.select("div.jobBox");
            Elements headersNode = jobNode.select("h1");
            Elements contentNode = jobNode.select("content");


            for(int i = 0; i < headersNode.size(); i++){
                headersList.add(headersNode.get(i).text());
            }

            for(int i = 0; i < contentNode.size(); i++){
                contentList.add(contentNode.get(i).text());
            }
        }

    }

【问题讨论】:

  • 尝试从 url 打印您的回复以先登录
  • 连接工作正常,我之前用简单的文本视图测试过
  • 既然你已经从服务器获取数据,必须尝试 notifyDataSetChanged() 吗?

标签: android listview


【解决方案1】:

希望这对你有用,这里我使用异步任务而不是线程

public class MainActivity extends Activity {

    String s;
    List<String> headersList = new ArrayList<String>();
    List<String> contentList = new ArrayList<String>();
    ListView listview;
    StableArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview = (ListView) findViewById(R.id.listView1);
        // threadStart();

        // Here i implemented Asynchronous Task instead of Thread
        new SampleAsyncTask().execute();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


public class SampleAsyncTask extends AsyncTask<Void, Void, Void> {

    private final ProgressDialog dialog = new ProgressDialog(
            MainActivity.this);

    protected void onPreExecute() {
        this.dialog.setMessage("Loading...");
        this.dialog.setCancelable(false);
        this.dialog.show();
    }

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

        try {
            webRequest();
            adapter = new StableArrayAdapter(MainActivity.this,
                    android.R.layout.simple_list_item_1, headersList);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Void result) {

        // Here if you wish to do future process for ex. move to another
        // activity do here
        listview.setAdapter(adapter);
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

    }

}

    private class StableArrayAdapter extends ArrayAdapter<String> {

        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

        public StableArrayAdapter(Context context, int textViewResourceId,
                List<String> objects) {
            super(context, textViewResourceId, objects);
            // TODO Auto-generated constructor stub
            for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
            }
        }

        @Override
        public long getItemId(int position) {
            String item = getItem(position);
            return mIdMap.get(item);
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }
    }

    public void webRequest() throws Exception {
        String servisURL = "http://www.sczg.unizg.hr/student-servis/";
        Document doc = Jsoup.connect(servisURL).get();

        Elements jobNode = doc.select("div.jobBox");
        Elements headersNode = jobNode.select("h1");
        Elements contentNode = jobNode.select("content");

        for (int i = 0; i < headersNode.size(); i++) {
            headersList.add(headersNode.get(i).text());
        }

        for (int i = 0; i < contentNode.size(); i++) {
            contentList.add(contentNode.get(i).text());
        }
    }

}

【讨论】:

  • 是的,它有效! :D 我现在明白为什么异步任务比普通线程好。我以前听说过它,但我不知道如何设置它。谢谢详细解答!
【解决方案2】:

首先我建议你阅读this guide,尤其是关于Using AsyncTask而不是原始线程。

第二,据我了解,您想从 UI 线程调用 adapterInit 吗? 所以,你可以试试这个:

runOnUiThread( // <-- method from Activity
    new Runnable()
    {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            adapterInit();
        }
    }
);

【讨论】:

    【解决方案3】:

    也许问题是您没有在适配器上调用方法 notifyDataSetChanged() 来强制它更新他的信息,这就像通知适配器底层数据已更新并且它需要刷新关联的列表视图。

    您应该在从网站获取数据后调用它。

    【讨论】:

      【解决方案4】:

      您可以使用处理程序。 在 webRequest 线程中,当 webRequest() 完成后,您使用 Handler 将主线程通知到 adapterInit()。不要在 webRequest 线程中使用另一个线程。 一个简单的例子。

      @Override
                                      public void onClick(DialogInterface dialog,
                                              int which) {
                                          setControlsEnable(false);
                                          new Thread() {
                                              public void run() {
                                                  WebserviceMethod wb = new WebserviceMethod();
                                                  if (wb.DeleteEmployee(
                                                          VerificationUtils
                                                                  .GetInstance()
                                                                  .CreateToken(),
                                                          personId) == 1) {
                                                      Message msg = new Message();
                                                      msg.obj = SwitchActivityValue.SWITCH_DELETEPERSON_OK;
                                                      mHandler.sendMessage(msg);
                                                  } 
                                          }.start();
                                      }
      @Override 
      public void handleMessage(Message msg){
          super.handleMessage(msg);
          SwitchActivityValue value = (SwitchActivityValue)msg.obj;
          switch (value) {
          case SWITCH_DELETEPERSON_OK:
              ManageUtils.EmployeeListDataForAdmin.personInfos.clear();
              ManageUtils.EmployeeListDataForAdmin.currentPage = 0;
              mActivity.switchActivity(mValue);
              break;
          case SWITCH_DELETEPERSON_FAILED:
              break;
          default:
              break;
          }
          mActivity.showMessage(value);
      }
      

      如示例,可以在Handler中绑定数据。当线程结束后,使用hander发送消息通知handleMessage处理其他人。

      【讨论】:

      • 这可以工作,但我不知道如何实现它:D 正如我所说的那样,我是 java 的菜鸟。你能给我举个例子吗?
      猜你喜欢
      • 2021-11-20
      • 2014-11-21
      • 2013-02-17
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多