鍍金池/ 問答/C  Android  網(wǎng)絡(luò)安全/ Android 中 SwipeRefreshLayout與RecyclerVie

Android 中 SwipeRefreshLayout與RecyclerView

用RecyclerView結(jié)合SwipeRefreshLayout,想做一個下拉刷新的列表。

問題1:
在界面初始化時調(diào)用 swipeRefresh.setRefreshing(true);
無法進入監(jiān)聽器的 onRefresh方法.只能手工滑動界面才能進入。

問題2:
initData方法用來加載數(shù)據(jù),數(shù)據(jù)加載完畢后調(diào)用RecyclerView的 adapter.notifyDataSetChanged();
卻沒有去執(zhí)行Adapter中的onBindViewHolder方法。

貼一下關(guān)鍵代碼,HomeFragment相關(guān)代碼

    private ArrayList<Integer> dietIds = new ArrayList<Integer>();
    List<Diet> dietList = new ArrayList<>();
    boolean isLoading;

    RecyclerViewAdapter<Diet> adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false); 
        initBanner(view);
        initGridView(view);
        initSwipeRefreshLayout(view);
        initTextView(view);
        initRecyclerView(view);
        return view;
    }
    
    ...
    
    private void initSwipeRefreshLayout(View view) {
        swipeRefreshLayout = view.findViewById(R.id.home_swipeRefresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.appColor);
        swipeRefreshLayout.setOnRefreshListener(() -> {
            LogUtil.d("swipe onRefresh initData");
            initData();
        });
        swipeRefreshLayout.setRefreshing(true); //此處不會進入監(jiān)聽器的onRefresh方法
    }
    
    private void initRecyclerView(View view) {
        recyclerView = view.findViewById(R.id.home_recyclerView);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new RecyclerViewAdapter<Diet>(R.layout.item_listview_common, dietList) {
            @Override
            public void bindView(TViewHolder holder, Diet item) { // 這是一個回調(diào)函數(shù),但不會執(zhí)行
                LogUtil.d("aabbcc" + item.getDietId());
            }
        };
        recyclerView.setAdapter(adapter);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if (!isLoading) {
                    isLoading = true;
                    new Thread() {
                        @Override
                        public void run() {
                            initData();
                            isLoading = false;
                        }
                    }.start();
                }
            }
        });
    }

    private void initData() {
        dietIds.clear();
        RequestParams params = new RequestParams(SysParameter.URL_GetDailyRecommend);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                dietList = ...; // 得到數(shù)據(jù)

                adapter.notifyDataSetChanged(); //不會調(diào)用上面的bindView()
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }

這是Adapter

public abstract class RecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<T> data;
    private int layoutId;

    public RecyclerViewAdapter(int layoutId, List<T> data) {
        this.layoutId = layoutId;
        this.data = data;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        TViewHolder viewHolder = new TViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        LogUtil.d("aabbcc_here"); //這句話不會打印
        if (holder instanceof TViewHolder) {
            LogUtil.d("aabbcc_position" + position);
            bindView((TViewHolder) holder, data.get(position));
        }
    }

    public abstract void bindView(TViewHolder holder, T item);

    @Override
    public int getItemCount() {
        return data.size();
    }

    public static class TViewHolder extends RecyclerView.ViewHolder {

        private SparseArray<View> mViews;   //存放每個Item子項中的控件
        private View item;                  

        public TViewHolder(View itemView) {
            super(itemView);
            item = itemView;
            mViews = new SparseArray<>();
        }
        ... //其他操作
}
回答
編輯回答
巴扎嘿
private void initData() {
        dietIds.clear();
        RequestParams params = new RequestParams(SysParameter.URL_GetDailyRecommend);
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
               // dietList = ...; // 得到數(shù)據(jù)
                //==============change===============
                dietList.clear();
                dietList.addAll(...);//這樣添加所有的數(shù)據(jù)試試
                //===============change===============
                adapter.notifyDataSetChanged(); //不會調(diào)用上面的bindView()
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }
2018年5月14日 23:04