Android - AsyncTask没有刷新Fragment RecyclerView

时间:2016-08-22 22:00:30

标签: android android-fragments android-asynctask

我是Android上的新手,我已按照此link创建了我的应用的初始结构,TabLayoutViewPager

每个页面都是一个片段(我不知道它是否是正确的方式),但它的设置如下:

public class BaseActivity extends AppCompatActivity {

   protected void onCreate(Bundle savedInstanceState) {
       ...
       ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
       adapter.addFragment(new CarListFragment());
       adapter.addFragment(new ProductsFragment());
       adapter.addFragment(new UserFragment());
       this.baseViewPager.setAdapter(adapter);
   }

}

CarListFragment

public class CarListFragment extends Fragment implements ICarListTask {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View carListFragment = inflater.inflate(R.layout.carlist_fragment, parent, false);
        carList = (RecyclerView) carListFragment.findViewById(R.id.car_list);

    new CarListTask(this.getContext(), this).execute();

    return carListFragment;
}

@Override
public void onLoadingComplete(ArrayList<Car> result) {

    if (carList != null) {

        if (result == null) {
            ...
        }
        else {
            adapter = new CarAdapter(this.getContext(), result);
            adapter.notifyDataSetChanged();
        }
    }
}

* CarListTask没有相关代码(只是从网络API获取一些数据)。

问题是永远不会调用CarAdapter.onCreateViewHolderCarAdapter.onBindViewHolder,因此不会填充RecyclerView。

为什么会发生这种情况的任何建议?

修改

CarList实施:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:id="@+id/car_list"
    android:layout_width="320dp"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="20dp"
    android:scrollbars="none"
    android:overScrollMode="never"
    android:divider="@android:color/transparent"
    android:clipToPadding="false"
    android:dividerHeight="10sp"/>

<TextView
    android:id="@+id/empty"
    android:text="@string/empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />

</RelativeLayout>

CarListTask:

public class CarListTask extends AsyncTask<Object, Object, ArrayList<Car>> {

private Context context;
private ICarListTask callback;

public CarListTask (Context context, Fragment fragment) {
    this.context = context;
    this.callback = (ICarListTask) fragment;
}

@Override
protected ArrayList<Car> doInBackground(Object... params) {

    ...// methods to connect to web API
    try {

        //data is the result from WEB API, which is OK
        JSONArray result = new JSONArray(data);
        Type collectionType =  new TypeToken<ArrayList<Car>>(){}.getType();
        return new Gson().fromJson(result.toString(), collectionType);

    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }

}

@Override
public void onPostExecute(ArrayList<Car> result) {
    super.onPostExecute(result);
    this.callback.onLoadingComplete(result);
}
}

2 个答案:

答案 0 :(得分:1)

将线性布局管理器添加到recyclerview:

cartList.setLayoutManager( new LinearLayoutManager(this));

RecyclerView需要具有布局管理器和要实例化的适配器。布局管理器将项目视图放在RecyclerView内部,并确定何时重用用户不再可见的项目视图。

RecyclerView提供这些内置布局管理器:

  1. LinearLayoutManager以垂直或水平方式显示项目 滚动列表。
  2. GridLayoutManager显示网格中的项目。
  3. StaggeredGridLayoutManager以交错网格显示项目。
  4. Recyclerview使用指南:

    https://guides.codepath.com/android/using-the-recyclerview

答案 1 :(得分:0)

您每次都在创建一个新的适配器,但是您没有设置它

adapter = new CarAdapter(this.getContext(), result);
adapter.notifyDataSetChanged();

NotifyDataSetChanged()没有用,因为它是一个新的适配器,没有设置为任何回收器。

adapter = new CarAdapter(this.getContext(), result);
carList.setAdapter(adapter);

或在适配器中创建一个获取结果的方法,然后调用NotifyDataSetChanged()