gpt4 book ai didi

java - ArrayAdapter 中的 getView() 未从 AsyncTask 调用

转载 作者:行者123 更新时间:2023-12-01 18:54:29 25 4
gpt4 key购买 nike

在我的一个 Android Activity 中,我有一个 ListView lvFeedsListlistView 中的每个行元素将包含 3 个 TextView - RSSFeedName、publishDate 和 feedLength

提要的内容是从 HTTPRsponse 检索的。我在 AsyncTask 中获取此响应。

因此,在 doInBackground() 中,我发送了 HTTPRequest 并接收并解析了响应并准备了包含 3 的 ArrayList上述信息。

然后,仅在 doInBackground() 内部,我创建自定义的 ArrayAdapter,用于在行元素中形成 3 个 TextViews。我的 Intent 是在 onPostExecute() 中的 ListView 上设置此适配器。

但是,当我运行应用程序时,ListView 不显示任何内容。

我尝试调试,似乎 ArrayAdapter 类中的 getView() 没有被调用。 (但我不确定是否是这个原因)。

这是代码,抱歉太长了......这似乎是必要的。

Activity 代码:

public class GenericFeedsActivity extends Activity{

private ListView lvFeedsList;
private ArrayList<FeedsClass> feedList;

protected void onCreate(Bundle savedInstanceState) {
...
lvFeedsList = (ListView) findViewById(R.id.lvFeedsList);
lvFeedsList.setOnItemClickListener(this);
lvFeedsList.setEnabled(false);
...
new AsyncResponseHandler(this).execute();
}

class AsyncResponseHandler extends AsyncTask {
Context context;
FeedListAdapter adapter;

public AsyncResponseHandler(Context c) {
this.context = c;
}

@Override
protected Object doInBackground(Object... params) {
...
/*
* Sending HTTPRequest to a URL & getting list of feeds
* Saving this list of feeds in a ArrayList -feedList, containing elements of type FeedsClass (declared above)
* Below line parses the HTTPResponse XML & stores various information in feedList.
*/
feedList = utils.parseRssResponseXML(in); // Working fine, geeting elements
adapter = new FeedListAdapter(
GenericFeedsActivity.this, feedList);
in.close();
return null;
}

protected void onPostExecute(Object e) {
// Setting Arrayadapter
lvFeedsList.setAdapter(adapter);
lvFeedsList.setEnabled(true);
}
}
}

适配器代码:

public class FeedListAdapter extends ArrayAdapter {

private Context context;
private ArrayList<FeedsClass> feedList;

public FeedListAdapter(Context c, ArrayList<FeedsClass> data) {
super(c, R.layout.rowlayout);
this.context = c;
this.feedList = data;
}

class ViewHolder {
TextView tvFeedName;
TextView tvFeedPubDate;
TextView tvFeedLength;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
if (row == null) {

LayoutInflater inflator = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflator.inflate(R.layout.rowlayout, null);
holder = new ViewHolder();

holder.tvFeedName = (TextView) row.findViewById(R.id.tvFeedName);
holder.tvFeedPubDate = (TextView) row.findViewById(R.id.tvFeedPubDate);
holder.tvFeedLength = (TextView) row.findViewById(R.id.tvFeedLength);

row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
// Getting values of feedName, publishDate & feedLength
String feedName = feedList.get(position).getTitle();
String feedDate = feedList.get(position).getPublishDate();
String feedLength = feedList.get(position).getStreamLength();

holder.tvFeedName.setText(feedName);
holder.tvFeedPubDate.setText(feedDate);
holder.tvFeedLength.setText(feedLength);
}
return row;
}
}

最佳答案

问题是您正在子类化 ArrayAdapter。这不起作用,因为 ArrayAdapter 内部认为您的数据中没有任何元素;它不仅神奇地知道查看 lvFeedsList 变量,因为它使用的数据集是内部的。

相反,在构造函数中确保调用此构造函数:

适配器代码:

public FeedListAdapter(Context c, ArrayList<FeedsClass> data) {
super(c, R.layout.rowlayout, data); // add 'data'
this.context = c;
this.feedList = data;
}

这将使一切正常工作。

关于java - ArrayAdapter 中的 getView() 未从 AsyncTask 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14570117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com