【问题标题】:custom ArrayAdapter is not being called未调用自定义 ArrayAdapter
【发布时间】:2012-04-19 10:01:14
【问题描述】:

我正在编写一个应用程序,它从 RSS 提要中获取信息,使用 DOM 解析器对其进行解析(客户端 RSS 提要存在问题),然后在 ListView 中显示已解析的对象。

由于某种原因,getView() 没有被调用...

这里是活动的代码:

public class NoPicList extends Activity {
    ListView list;
    NoPicAdapterV2 adapter2;
    ProgressDialog mDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.no_pic_list);
        list = (ListView) findViewById(R.id.noPicListView);

        // get the request from the main activity
        Bundle b = getIntent().getExtras();
        String request = b.getString("REQUEST");

        mDialog = new ProgressDialog(this);
        mDialog.setCancelable(false);
        mDialog.setMessage("Lodaing Data");
        mDialog.show();

        new GetNewsAndCalendar().execute(request);
    }

    @Override
    protected void onPause() {
        mDialog.dismiss();
        super.onPause();
    }

    class GetNewsAndCalendar extends
        AsyncTask<String, Void, ArrayList<Message>> {

        @Override
        protected ArrayList<Message> doInBackground(String... params) {
            String url = params[0];
            DOMFeedParser parser = new DOMFeedParser(url);
            return parser.parse();
        }

        @Override
        protected void onPostExecute(ArrayList<Message> result) {
            adapter2 = new NoPicAdapterV2(NoPicList.this, R.layout.no_pic_list_item, result);
            list.setAdapter(adapter2);
            mDialog.dismiss();
            }

    }

}

这是适配器的代码:

public class NoPicAdapterV2 extends ArrayAdapter<NewAndCalendar> {
    private ArrayList<Message> data;
    private LayoutInflater inflator;
    private Activity mActivity;

    public NoPicAdapterV2(Context context, int textViewResourceId,
        ArrayList<Message> result) {
        super(context, textViewResourceId);
        data = (ArrayList<Message>) result;
        mActivity = (Activity) context;
        inflator = (LayoutInflater) mActivity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (vi == null)
            vi = inflator.inflate(R.layout.no_pic_list_item, parent, false);

        TextView title = (TextView) vi.findViewById(R.id.noPicTitle);
        TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle);
        TextView id = (TextView) vi.findViewById(R.id.noPicID);

        title.setText(data.get(position).getTitle().toString());
        subtitle.setText(data.get(position).getDate().toString());
        id.setText(data.get(position).getDescription());

        return vi;
    }
}

DOMFeedParser 代码是根据IBM open source Java XML parser article 构建的。

非常感谢...

【问题讨论】:

  • onPostExecute 中的result.size() 怎么样?
  • 可能是因为列表计数为0..我的意思是数据为空。
  • 您的result 是否包含onPostExecute 中的数据?
  • 返回的结果充满了数据,我在发布问题之前仔细检查了这一点

标签: java android android-arrayadapter


【解决方案1】:

您应该覆盖(在您的自定义适配器中)

getCount()

并返回data 的大小以让adpater 工作。或者你调用带有data的ArrayAdapter构造函数@

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

【讨论】:

  • 好吧,我覆盖了这个函数,现在getView()被调用了。但正在显示的视图不是完整列表,而是 list_item。所以我将调用的构造函数从adapter2 = new NoPicAdapterV2(NoPicList.this, R.layout.no_pic_list_item, result); 更改为R.layout.no_pic_list,当然是列表而不是列表项,但是,仍然没有发生任何事情...
  • 列表视图将包含等于 data.size() 的条目数。我不明白你在评论中的意思
  • 最简单的方法是给 super 数组。在 arrayadapter 中保留对数组的本地引用是没有意义的,因为 super 已经这样做了
  • 它也很容易覆盖。然后,如果您阅读了整个答案,我已经告诉他使用其他构造函数
【解决方案2】:

您的 ArrayAdapter 不知道您的数组的内容,因此计数为 0。

改用这个超级构造函数:http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20java.util.List%3CT%3E%29

像这样:

public NoPicAdapterV2(Context context, int textViewResourceId,
    ArrayList<Message> result) {
    // Here
    super(context, textViewResourceId, result);
    data = (ArrayList<Message>) result;
    mActivity = (Activity) context;
    inflator = (LayoutInflater) mActivity
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

【讨论】:

    【解决方案3】:

    我希望下面的代码能够正常工作,只需向 super(...) 添加一个参数即可

    public NoPicAdapterV2(Context context, int textViewResourceId,
            ArrayList<Message> result) {
            super(context, textViewResourceId,result);
            data = (ArrayList<Message>) result;
            mActivity = (Activity) context;
            inflator = (LayoutInflater) mActivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多