2016-08-22 3 views
0

Я добрый новый на Android, и я следил за этим link, чтобы создать начальную структуру моего приложения, с TabLayout и ViewPager.Android - AsyncTask не освежает Fragment RecyclerView

Каждая страница представляет собой фрагмент (который я не знаю, если это правильный путь), но это выставиться так:

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 не заполняется.

Любые предложения, почему это происходит?

EDIT:

Реализация Карлистские:

<?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

Вы должны показать нам, как 'carList' определяется и то, что' CarListTask' код выглядит следующим образом. –

+0

Вам также нужно установить адаптер – Shubham

+1

Кажется, у recyclerview нет набора менеджеров макетов, установите диспетчер компоновки: cartList.setLayoutManager (новый LinearLayoutManager (это)); Дайте мне знать, если это поможет. –

ответ

1

Добавить линейный менеджер компоновки в recyclerview:

cartList.setLayoutManager(new LinearLayoutManager(this)); 

RecyclerView должен иметь раскладку менеджера и адаптера для создания экземпляра. Менеджер компоновки позиционирует представления элементов внутри RecyclerView и определяет, когда повторно использовать представления элементов, которые больше не видны пользователю.

RecyclerView предоставляет эти встроенные менеджер компоновки:

  1. LinearLayoutManager показывает детали в вертикальном или горизонтальном прокрутке списка .
  2. GridLayoutManager показывает объекты в сетке.
  3. StaggeredGridLayoutManager показывает элементы в шахматном порядке.

Руководство по использованию Recyclerview:

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

0

Вы создаете новый адаптер каждый раз, но вы не установите его

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

NotifyDataSetChanged() не имеет смысла, поскольку это новый адаптер, который не настроен на какой-либо повторитель.

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

или создать метод в адаптер, который принимает результат, а затем вызвать NotifyDataSetChanged()

+0

Установка адаптера на 'carList' была моим первым выстрелом. Затем я смутился и потерял какой-то код. Но это не сработало. – Leonardo

+0

Он должен работать, все остальные делают это так. – ElDuderino

+0

Я также думал, что это будет, но я не знаю, почему это не так. – Leonardo

Смежные вопросы