Listview getView方法没有被调用

时间:2015-06-17 18:09:02

标签: android listview android-listview baseadapter swiperefreshlayout

这类问题已被问过很多次,但SO上的解决方案都没有对我有用,所以我再次要求帮助。我有一个自定义ListView,它实现了pull-to-refresh并且工作正常,直到我决定使用新的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()返回了正确的项目数。这里有什么问题。谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

onCreateView()中,它没有返回 root 视图,它返回null,因为类成员v最初为null且未被修改。

现有代码,更改FROM:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

   if (v == null) {
      View v = inflater...
   }

   return v;

建议的代码,更改TO(或类似于此):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View view = inflater...
       ...
       return view;

注意:

  • 在建议的代码中,删除if检查,不需要它。
  • 使用return view返回根视图。