0
public class ShopsList extends AppCompatActivity { 

private RecyclerView listView; 
private StoreListAdapter mAdapter; 
private ArrayList<Stores> stores; 
public static final String LOG_TAG = ShopsList.class.getName(); 
private String sampleURL = "http://104.199.230.125/stores/1.json/"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_shops_list); 
    StoresAsyncTask task = new StoresAsyncTask(); 

    task.execute(sampleURL); 

    mAdapter = new StoreListAdapter(this, R.layout.list_item_layout, stores); 
    listView = (RecyclerView) findViewById(R.id.store_list); 

    RecyclerView.LayoutManager layoutManager = new  LinearLayoutManager(this); 
    listView.setLayoutManager(layoutManager); 

    listView.setAdapter(mAdapter); 

     private class StoresAsyncTask extends AsyncTask<String, Void, List<Stores>> { 
    @Override 
    protected List<Stores> doInBackground(String... URLs) { 


     if (URLs.length < 1 || URLs[0] == null) { 
      Log.e("QueryUtils", "URL is is null"); 
      return null; 
     } 
     Log.e("QueryUtils", "URL is not null" + URLs[0]); 

     return QueryHandler.fetchStoreData(URLs[0]); 
    } 
    @Override 
    protected void onPostExecute(List<Stores> data) { 

     mAdapter.notifyDataSetChanged(); 
     listView.setAdapter(mAdapter); 
     super.onPostExecute(data); 
    } 
} 


} 

он не отображает список, он просто отображает пустой список. Я использую recyclerview.adapter. Существует также эта проблема: getItemCount() генерирует исключение nullpointer, когда используется [return this.stores.size();] и приложение не открывается, когда я меняю эту строку на [return this.stores == null? 0: stores.size();] он открывается, но с пустым списком.Что случилось с этим методом onPostexecute в Asynctask?

public int getItemCount() { 

    Log.e(LOG_TAG, "stores size"); 
//  return this.stores.size(); 
    return this.stores == null ? 0 : stores.size(); 
} 

, когда я использую List view the postexecute body тела, это и работает.

protected void onPostExecute(List<Quakes> data) { 
     mAdapter.clear(); 
     if (data != null && !data.isEmpty()) { 
      mAdapter.addAll(data); 
     } 
    } 

как правильно выполнить метод postexecute в AsyncTask, что связано с recyclerview.adapter? Разбор JSON без ошибок, только я не могу загрузить его в адаптер.

Это адаптер

общественного класса StoreListAdapter расширяет RecyclerView.Adapter {

private ArrayList<Stores> stores = new ArrayList<>(); 
private int itemResource; 
private Context context; 

public StoreListAdapter(Context context, int itemResource, ArrayList<Stores> stores) { 

    this.stores = stores; 
    this.itemResource = itemResource; 
    this.context = context; 
} 

@Override 
public storeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(
      R.layout.list_item_layout, parent, false); 

    return new storeViewHolder(this.context, view); 
} 

@Override 
public void onBindViewHolder(storeViewHolder holder, int position) { 
    Stores stores = this.stores.get(position); 
    holder.bindStoreData(stores); 
} 

@Override 
public int getItemCount() { 

    Log.e(LOG_TAG, "stores size"); 
    return this.stores.size(); 
}} 
+0

Я думаю, вы забыли положить mAdapter.notifydatasetchanged(); – Varma460

+0

см. Первый код метода onPostExecute, не там, где mAdapter.notifydatasetchanged(); идет? Примечание: последний код метода onPostExecute работает отлично, что связано с представлением списка. приведенный выше код метода onPostExecute, связанный с recyclerview, не работает. , пожалуйста, предложите любые изменения там. –

+0

@ P.Vamsi try commenting listView.setAdapter (mAdapter); перед Asynctask –

ответ

1

Когда вы получите код onPostExecute, вы должны передать эти данные в списке адаптеров

@Override 
    protected void onPostExecute(List<Stores> data) { 
     mAdapter = new StoreListAdapter(this, R.layout.list_item_layout, data); 
     listView.setAdapter(mAdapter); 
     super.onPostExecute(data); 
    } 

Другое Кстати, я думаю, что лучше, если вы создаете адаптер пользовательского списка, введите getter и setter или метод, например addAll, для обновления данных в адаптере списка.

После отредактированной Создать геттер и сеттер ArrayList<Stores> stores, а затем

@Override 
     protected void onPostExecute(List<Stores> data) { 
      mAdapter.setStores(data); 
      mAdapter.notifyDataSetChanged(); 
     } 

Также в shopList класса private ArrayList<Stores> stores= = new ArrayList<>(); может избежать исключения нулевого

+0

Адаптер бросает nullpointer в getItemcount и bindviewholder. Я использую пользовательский адаптер, загруженный выше, как обновлять данные в методе. –

+1

Ничего себе, спасибо человеку. последняя строка "Также в классе shopList private ArrayList stores = = new ArrayList <>(), может избегать нулевого исключения", твой трюк. Я поддержал ваш ответ, но он говорит, что он не считается, так как у меня есть репутация <15. –

0

вы дали ответ на ваш собственный вопрос программно:

Решение 1 от вас:

@Override 
    protected void onPostExecute(List<Stores> data) { 

     mAdapter.notifyDataSetChanged(); 
     listView.setAdapter(mAdapter); 
     super.onPostExecute(data); 
    } 

Решение 2 от вас:

@Override 
protected void onPostExecute(List<Quakes> data) { 
     mAdapter.clear(); 
     if (data != null && !data.isEmpty()) { 
      mAdapter.addAll(data); 
     } 
    } 

В растворе 1, вы добавляете адаптер снова ListView, но делать обновление данных списка к адаптеру. Таким образом, это ошибка, которую вы делаете здесь, которая решается в решении 2.

Заключение: Нет проблемы с onPostExecute. Проблема заключается в передаче обновленных данных в адаптер и создании notifyDataDetChange для применения обновленных данных в listview.

Так добавить данные к адаптеру, создав метод логотипо, как вы сделали с mAdapter.addAll (данные/новые данные /), а затем сделать notifyDataSetChange(), чтобы получить обновления недавно обновленные данные с ListView.

@Override 
protected void onPostExecute(List<Quakes> data) { 
     if (data != null && !data.isEmpty()) { 
      mAdapter.addAll(data); 
      mAdapter.notifyDataSetChange(); 
     } 
    } 

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

  • Нет связанных вопросов^_^