创建ArrayAdapter后设置项目?

时间:2014-02-08 12:50:23

标签: android listview android-arrayadapter

在我的应用中,我正在显示从互联网下载的项目列表(pItem类型)。我正在使用扩展ArrayAdapter<pItem>的自定义ArrayAdapter,基本上是这样的:

public class PArrayAdapter extends ArrayAdapter<pItem> {

private List<pItem> pList = new ArrayList<pItem>();

public PArrayAdapter(Context context) {
    super(context, R.layout.p_row);
    this.context = context;
}


public void SetList(List<PItem> pl){
    pList = pl;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = convertView;

    if (rowView == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        rowView = vi.inflate(R.layout.p_row, null);
    }

    // ...

    return rowView;
}

}

现在,通常在创建自定义ArrayAdapter时,会在构造函数中设置项列表。但在我的情况下,当我动态获取AsyncTask中的项目(列表不断变化)时,我将项目的设置与适配器的创建分开。

在我的主要活动中,这就是我所做的:(只是代码的主要部分)

public class MainPageActivity extends SherlockFragmentActivity implements
OnScrollListener {

// List of items
private List<pItem> pList = new ArrayList<pItem>();

// Adapter
private arrayAdapter pAdapter;

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

    //...

    listView = (ListView) findViewById(R.id.p_list);

    adpater = new PArrayAdapter(getApplicationContext());

    new ASTask().execute("");
}

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

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

        // Add the downloaded items to list
        pList.addAll(Downloader.GetItems());

        return "";
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("Main", String.valueOf(pList.size())); // Shows the right number

        // Show Items
        pAdapter.setList(pList);
        listView.setAdapter(pAdapter);

        Handler mHandler = new Handler(Looper.getMainLooper());

        Runnable rn = new Runnable() {
            @Override
            public void run() {
                pAdapter.notifyDataSetChanged();
            }
        };

        mHandler.post(rn);
    }

    @Override
    protected void onPreExecute() {}

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

}


}

问题在于:当我运行它时, listView 中没有显示任何内容。它没有任何错误。

但是如果我在PArrayAdapter的构造函数中设置列表,一切正常,我会看到这些项目。

我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

添加 pAdapter.notifyDataSetChanged(); 在onPostExecute()方法结束时。

试试这样:

@Override
    protected void onPostExecute(String result) {
        Log.d("Main", String.valueOf(pList.size())); // Shows the right number

        // Show Items
        pAdapter.setList(pList);
        listView.setAdapter(pAdapter);
        pAdapter.notifyDataSetChanged();       
    }

答案 1 :(得分:0)

onPostExecute中的

删除此代码

Handler mHandler = new Handler(Looper.getMainLooper());

    Runnable rn = new Runnable() {
        @Override
        public void run() {
            pAdapter.notifyDataSetChanged();
        }
    };

    mHandler.post(rn);

仅添加此行

pAdapter.notifyDataSetChanged();

答案 2 :(得分:0)

行。我发现了什么是我的问题。这实际上是一个新手的错误:

而不是将输入列表分配给适配器内的列表:

pList = pl;

我应该添加所有这样的项目:

pList.addAll(pl);

这解决了这个问题。