Listview getView 方法未被调用
Listview getView method not getting called
此类问题已被问过很多次,但是 none SO 上的解决方案对我有用,所以我再次寻求帮助。我有一个自定义的 ListView
,它实现了下拉刷新并且工作正常,直到我决定使用新的 SwipeRefreshLayout
,现在我的自定义适配器 getView
没有被调用。
这是我的 xml 布局:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/myList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#3D3C3A"
android:background="@color/Red"
android:dividerHeight="1dp"/>
</android.support.v4.widget.SwipeRefreshLayout>
这是我的片段:
public class MenuFragment extends Fragment implements OnItemClickListener{
View v;
String itemPostion;
ListView listView;
SwipeRefreshLayout mSwipeRefreshLayout;
List<RssItem> itemx = new ArrayList<RssItem>();
private ProgressBar pd;
private DisplayMetrics metrics;
RssAdapter adapter = null;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
startService();
listView.setFadingEdgeLength(0);
listView.setOnItemClickListener(this);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startService();
mSwipeRefreshLayout.setRefreshing(false);
}
}, 5000);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (v == null) {
View v = inflater.inflate(R.layout.fragment_layout, container, false);
listView = (ListView) v.findViewById(R.id.myList);
mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh);
mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue);
//pd = (ProgressBar) v.findViewById(R.id.progress);
//pd.setVisibility(View.VISIBLE);
startService();
}
else {
//ViewGroup parent = (ViewGroup) v.getParent();
//parent.removeView(v);
}
return v;
}
private void startService() {
Intent intent = new Intent(getActivity(), RssService.class);
intent.putExtra("mypostion", itemPostion);
intent.putExtra(RssService.RECEIVER, resultReceiver);
getActivity().startService(intent);
}
private final ResultReceiver resultReceiver = new ResultReceiver(new Handler()) {
@SuppressWarnings("unchecked")
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
List<RssItem> items = (List<RssItem>) resultData.getSerializable(RssService.ITEMS);
Log.e("Items", String.valueOf(items.size()));
if (items.size() > 0) {
adapter = new RssAdapter(getActivity(), items, metrics);
itemx = items;
listView.setAdapter(adapter);
}
else {
Toast.makeText(getActivity(), "Error occurred while downloading the feed.",Toast.LENGTH_LONG).show();
}
};
};
这是我的自定义适配器
public class RssAdapter extends BaseAdapter {
private final List<RssItem> items;
private final Context context;
private DisplayMetrics metricsy;
private String website, title, newImageURL;
public RssAdapter(Context contextx, List<RssItem> itemsx, DisplayMetrics metricsx) {
super();
items = itemsx;
metricsy = metricsx;
context = contextx;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int id) {
return id;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.rss_item, null);
holder = new ViewHolder();
holder.itemTitle = (TextView) convertView.findViewById(R.id.itemTitle);
holder.itemSource = (TextView) convertView.findViewById(R.id.itemSource);
holder.imageicon = (ImageView) convertView.findViewById(R.id.imgicon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Animation animation = AnimationUtils.loadAnimation(context, R.anim.push_left_in);
String source = items.get(position).getLink();
String myDesc = items.get(position).getDesc();
String mytitle = items.get(position).getTitle();
String myImage = items.get(position).getMlink();
Log.e("Link", source);
convertView.startAnimation(animation);
return convertView;
}
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
RssItem item = itemx.get(position);
Uri uri = Uri.parse(item.getLink());
Intent i = new Intent(getActivity(),WebViewActivity.class);
i.putExtra("mystring",uri.toString());
startActivity(i);
}
@Override
public void onResume() {
super.onResume();
}
static class ViewHolder {
TextView itemTitle;
TextView itemSource;
ImageView imageicon;
}
}
问题是 RssAdapter
的 getView 方法从未被调用,即使 getCount()
返回了正确的项目数。这里做错了什么。感谢您的帮助
在 onCreateView
() 中,它没有返回 root 视图,它返回 null 因为 class 成员 v
是最初为 null 且未修改。
现有代码,更改自:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (v == null) {
View v = inflater...
}
return v;
建议的代码,更改为(或类似于此):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater...
...
return view;
备注:
- 在建议的代码中,删除了 if 检查,不需要它。
- 使用
return view
返回根视图。
此类问题已被问过很多次,但是 none SO 上的解决方案对我有用,所以我再次寻求帮助。我有一个自定义的 ListView
,它实现了下拉刷新并且工作正常,直到我决定使用新的 SwipeRefreshLayout
,现在我的自定义适配器 getView
没有被调用。
这是我的 xml 布局:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/myList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#3D3C3A"
android:background="@color/Red"
android:dividerHeight="1dp"/>
</android.support.v4.widget.SwipeRefreshLayout>
这是我的片段:
public class MenuFragment extends Fragment implements OnItemClickListener{
View v;
String itemPostion;
ListView listView;
SwipeRefreshLayout mSwipeRefreshLayout;
List<RssItem> itemx = new ArrayList<RssItem>();
private ProgressBar pd;
private DisplayMetrics metrics;
RssAdapter adapter = null;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
startService();
listView.setFadingEdgeLength(0);
listView.setOnItemClickListener(this);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startService();
mSwipeRefreshLayout.setRefreshing(false);
}
}, 5000);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (v == null) {
View v = inflater.inflate(R.layout.fragment_layout, container, false);
listView = (ListView) v.findViewById(R.id.myList);
mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_refresh);
mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue);
//pd = (ProgressBar) v.findViewById(R.id.progress);
//pd.setVisibility(View.VISIBLE);
startService();
}
else {
//ViewGroup parent = (ViewGroup) v.getParent();
//parent.removeView(v);
}
return v;
}
private void startService() {
Intent intent = new Intent(getActivity(), RssService.class);
intent.putExtra("mypostion", itemPostion);
intent.putExtra(RssService.RECEIVER, resultReceiver);
getActivity().startService(intent);
}
private final ResultReceiver resultReceiver = new ResultReceiver(new Handler()) {
@SuppressWarnings("unchecked")
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
List<RssItem> items = (List<RssItem>) resultData.getSerializable(RssService.ITEMS);
Log.e("Items", String.valueOf(items.size()));
if (items.size() > 0) {
adapter = new RssAdapter(getActivity(), items, metrics);
itemx = items;
listView.setAdapter(adapter);
}
else {
Toast.makeText(getActivity(), "Error occurred while downloading the feed.",Toast.LENGTH_LONG).show();
}
};
};
这是我的自定义适配器
public class RssAdapter extends BaseAdapter {
private final List<RssItem> items;
private final Context context;
private DisplayMetrics metricsy;
private String website, title, newImageURL;
public RssAdapter(Context contextx, List<RssItem> itemsx, DisplayMetrics metricsx) {
super();
items = itemsx;
metricsy = metricsx;
context = contextx;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int id) {
return id;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.rss_item, null);
holder = new ViewHolder();
holder.itemTitle = (TextView) convertView.findViewById(R.id.itemTitle);
holder.itemSource = (TextView) convertView.findViewById(R.id.itemSource);
holder.imageicon = (ImageView) convertView.findViewById(R.id.imgicon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Animation animation = AnimationUtils.loadAnimation(context, R.anim.push_left_in);
String source = items.get(position).getLink();
String myDesc = items.get(position).getDesc();
String mytitle = items.get(position).getTitle();
String myImage = items.get(position).getMlink();
Log.e("Link", source);
convertView.startAnimation(animation);
return convertView;
}
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
RssItem item = itemx.get(position);
Uri uri = Uri.parse(item.getLink());
Intent i = new Intent(getActivity(),WebViewActivity.class);
i.putExtra("mystring",uri.toString());
startActivity(i);
}
@Override
public void onResume() {
super.onResume();
}
static class ViewHolder {
TextView itemTitle;
TextView itemSource;
ImageView imageicon;
}
}
问题是 RssAdapter
的 getView 方法从未被调用,即使 getCount()
返回了正确的项目数。这里做错了什么。感谢您的帮助
在 onCreateView
() 中,它没有返回 root 视图,它返回 null 因为 class 成员 v
是最初为 null 且未修改。
现有代码,更改自:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (v == null) {
View v = inflater...
}
return v;
建议的代码,更改为(或类似于此):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater...
...
return view;
备注:
- 在建议的代码中,删除了 if 检查,不需要它。
- 使用
return view
返回根视图。