2014-06-10 4 views
2

필자의 경우, 조각을 작업 내에서 탭으로 사용합니다. 조각을 만들 때 정보를로드하려고합니다. 그래서 내가 방법을 호출 한 후, 조각 내부의 목록보기가보기를 업데이트하지 못한 httprequest을 실행하고 난 다음notifyDataSetChanged가 단편화 된 ListView를 업데이트하지 못했습니다.

mAdapter.notifyDataSetChanged()이 문제를 오는 전화를 조각 내에서 사용자 정의 핸들러에 다시 그 응답을 넣어의 Runnable를 사용 notifyDataSetChanged() .

나는 스택을 추적 notifyDataSetChanged()의 호출 후, 어댑터는 방법 getCount()getCount() 제로 이상의 값을 반환 한 전화 않았다는 것을 발견하지만, 어댑터는 getCount()의 호출 후 그 방법 getView()를 호출하지 않았다. 당신이 onCreateView 방법 또는 ActivityCreated에 한 OnCreate 코드를 삽입 한

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); 
} 

} 
+1

y를 mActivity을 method..because .mAdapter.notifyDataSetChanged() ;? u는 간단하게 adpter.noti를 사용할 수 있습니다 ... 그리고 mAdapter 선언을 볼 수 없습니다. – KOTIOS

+0

mAdapter 선언은 onCreate() – luminos

답변

0

는 onCreateview 방법, 그래서 그냥 코드를 이동 onCreateView 전에 호출에서 onCreate 방법에 바인딩하는 XML UI ...

+0

thx 응답 위에 있습니다. onCreateView 메서드에서 Xml UI를 바인딩해도 문제가되지 않습니다. 어댑터에 데이터가 설정되어 있는지 확인하십시오. 데이터는 Xml UI에서 무료입니다. 나는 그 코드를 아래로 옮겨 보려고 노력하지만 작동하지 않는다. – luminos

+0

init ii 코드를 넣었습니까? –

관련 문제