【问题标题】:notifyDataSetChanged failed to update my ListView in fragmentnotifyDataSetChanged 未能在片段中更新我的 ListView
【发布时间】:2014-06-10 04:34:09
【问题描述】:

在我的例子中,我使用片段作为活动中的选项卡。我想在创建片段时加载信息。所以我使用 Runnable 来运行 httprequest 并将这些响应放回我调用 mAdapter.notifyDataSetChanged() 的片段内的自定义处理程序

问题来了,我调用notifyDataSetChanged()方法后,fragment里面的listView没能更新它的view。

我跟踪堆栈发现在调用notifyDataSetChanged()之后,适配器确实调用了它的方法getCount()getCount()确实返回了一个大于零的值,但是适配器没有调用它的方法getView()getCount()的电话之后。

public class ProductReviewFragment extends Fragment {


private View mBackgroundView = null;

private ProductHelper mProductHelper = null;

private PullToRefreshListView mListView = null;

private int pre = 20;

private long mark = 0;

private long productId = 0;

private List<ProductThread> listProductThread = new ArrayList<ListProductReviewResponse.ProductThread>();

private class MyHandler extends Handler{
    private ProductReviewFragment mActivity = null;

    public MyHandler(ProductReviewFragment activity){
        mActivity = activity;
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
        case ProductHelper.GET_PRODUCT_REVIEW_SUCCESS:
            ListProductReviewResponse response = (ListProductReviewResponse)msg.obj;
            if (response != null) {
                if (response.getProductThreadList()!=null) {
                    mActivity.listProductThread.addAll(response.getProductThreadList());
                }
                mActivity.mark = response.getMark();
                mActivity.mAdapter.notifyDataSetChanged();
            }
            mActivity.mListView.onRefreshComplete();
            if (mActivity.listProductThread.size()>=response.getTotalNumber()) {
                mActivity.mListView.setMode(Mode.DISABLED);
            }
            break;
        case ProductHelper.GET_PRODUCT_REVIEW_FAILED:
            mActivity.mListView.onRefreshComplete();
            if (msg.obj!=null) {
                NetWorkException exception = (NetWorkException)msg.obj;
                NetWorkException.handlerResultNetWorkNotAvailable(mActivity.getActivity(), exception);
            }
        default:

            break;
        }

    }
}

private MyHandler mHandler = new MyHandler(this);

private class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() {
        int i = listProductThread.size();
        return i;
    }

    @Override
    public Object getItem(int position) {
        return listProductThread.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

            convertView = View.inflate(getActivity(), R.layout.product_review_cell, null);

            holder.rivHead = (RoundImageView)convertView.findViewById(R.id.product_comment_head);

            holder.tvName = (TextView)convertView.findViewById(R.id.product_comment_user);

            holder.tvContent = (TextView)convertView.findViewById(R.id.product_comment_content);

            convertView.setTag(holder);
        }
        holder = (ViewHolder)convertView.getTag();

        holder.rivHead.setImageInfo(ImageInfo.obtain(ImageCategories.CATEGORY_ROUND_HEAD, listProductThread.get(position).getUser().getAvatarURL()));

        holder.tvName.setText(listProductThread.get(position).getUser().getUserName());

        holder.tvContent.setText(listProductThread.get(position).getContent());

        return convertView;
    }

    private class ViewHolder {
        RoundImageView rivHead = null;
        TextView tvName = null;
        TextView tvContent = null;
    }
}

private MyAdapter mAdapter = new MyAdapter();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle = getArguments();
    if (bundle!=null) {
        productId = bundle.getLong(ProductHelper.PRODUCT_ID);
    }

    mProductHelper = new ProductHelper(getActivity().getApplicationContext());
    mProductHelper.getProductReview(productId, mark, pre, mHandler);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mBackgroundView = inflater.inflate(R.layout.pulltorefresh_list_fragment, null);
    return mBackgroundView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    initUI();

}

public void initUI(){


    mListView = (PullToRefreshListView) mBackgroundView.findViewById(R.id.fragment_listview);

    mListView.setMode(Mode.PULL_FROM_END);

    mListView.setAdapter(mAdapter);
}

}

【问题讨论】:

  • y mActivity.mAdapter.notifyDataSetChanged();?你可以简单地使用 adpter.noti.... 我看不到 mAdapter 声明
  • mAdapter的声明在onCreate()方法之上

标签: android listview android-fragments


【解决方案1】:

您已将 oncreate 代码放在 onCreateView 方法或 ActivityCreated 方法中。因为您的 Xml UI 绑定在 onCreateview 方法中,并且 onCreate 方法在 onCreateView 之前调用,所以只需移动您的代码...

【讨论】:

  • 感谢回答。虽然我在 onCreateView 方法中绑定了 Xml UI,但这没关系。因为数据是在适配器中设置的。数据不受 Xml UI 的影响。我尝试将这些代码移到下面,但它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多