我是Android上的新手,我已按照此link创建了我的应用的初始结构,TabLayout
和ViewPager
。
每个页面都是一个片段(我不知道它是否是正确的方式),但它的设置如下:
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.onCreateViewHolder
和CarAdapter.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);
}
}
答案 0 :(得分:1)
将线性布局管理器添加到recyclerview:
cartList.setLayoutManager( new LinearLayoutManager(this));
RecyclerView需要具有布局管理器和要实例化的适配器。布局管理器将项目视图放在RecyclerView内部,并确定何时重用用户不再可见的项目视图。
RecyclerView提供这些内置布局管理器:
Recyclerview使用指南:
答案 1 :(得分:0)
您每次都在创建一个新的适配器,但是您没有设置它
adapter = new CarAdapter(this.getContext(), result);
adapter.notifyDataSetChanged();
NotifyDataSetChanged()没有用,因为它是一个新的适配器,没有设置为任何回收器。
adapter = new CarAdapter(this.getContext(), result);
carList.setAdapter(adapter);
或在适配器中创建一个获取结果的方法,然后调用NotifyDataSetChanged()