将RecyclerView的getItemCount()与onCreateViewHolder

时间:2016-01-03 04:29:05

标签: java android android-layout android-fragments

这个问题已经被打了一百万次,但遗憾的是,没有回答SO有助于解决我的问题。

从根本上说,我的问题是RecyclerView CardView Fragment 其中 应执行以下任务:

  • 从服务器获取数据到用户设备上的本地数据库
  • 处理如此获取的本地数据
  • 实例化和设置RecyclerView的适配器
  • 致电RecyclerView的{​​{1}}

我的实施中的notifyfDataSetChanged()目前只回拨RecyclerViewgetItemCount()onCreateViewHolder()永远不会被回电。 (我已经看到this answer和更多了。)

以下是其完成方式的顺序:

  1. onBindViewHolder()实例化AppCompatActivity
  2. Fragment的布局包含Fragment,其中包含工具栏和RelativeLayout的{​​{1}}标记。 include布局包含另一个ViewPager标记,用于在ViewPager中设置include的布局。 RecyclerView的布局XML在LinearLayout的适配器中设置:

    CardView
  3. 任何布局都没有RecyclerView

  4. public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.wtf(LOG_TAG, "Inside onCreateViewHolder()"); View myView; LayoutInflater inflater; inflater = LayoutInflater.from(parent.getContext()); myItemView = inflater.inflate(R.layout.my_row_layout, parent, false); MyViewHolder myViewHolderItem = new MyViewHolder(myItemView); return myViewHolderItem; } 的{​​{1}}调用从服务器获取数据的方法
  5. ScrollView
    1. 此数据将填充到用户设备上的本地数据库中
    2. Fragment onCreate()中的另一种方法将本地数据过滤为public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Some cache processing args = getArguments(); myDBHelper = MyDBHelper.getInstance(getActivity()); Intent intent = getActivity().getIntent(); // Search comes from search intent if (intent.getBooleanExtra(MyContract.MY_SEARCH_REQUEST, false)) { ... getDataFromCloud("", true); getDataFromLocalDB(false, item); } // of if search intent // Plain intent else { getDataFromCloud("item", false); getDataFromLocalDB(true, item); } } // of onCreate()
    3. Fragment最终会在onCreate() - ArrayList组合中显示给用户。
    4. 在片段ArrayList中调用
    5. RecyclerView。但事实是,它在任何被调用的地方都无法发挥作用。此外,适配器在CardView的{​​{1}}中实例化,从notifyDataSetChanged()为本地数据库创建onActivityCreated()
    6. 以下是运行应用程序时产生的日志:

      onPostExecute()

      在上面的日志中,AsyncTask查询提取服务器数据,ArrayList查询处理如此获取的本地数据。

      我在CardView01-03 08:47:34.546 13489-14033/com.my A/MyDBHelper class: Create View-1 query: CREATE VIEW 01-03 08:47:34.562 13489-13489/com.my A/MyFragment: getItemCount: 0 01-03 08:47:34.584 13489-14033/com.my A/MyDBHelper class: Create View-2 query: CREATE TABLE 01-03 08:47:34.638 13489-13489/com.my A/MyFragment: getItemCount: 0 01-03 08:47:34.722 13489-13489/com.my A/MyFragment: getItemCount: 2 01-03 08:47:34.743 13489-13489/com.my A/MyFragment: getItemCount: 2 中有日志语句。如上所述,尽管来自View-1的正回报是View-2的大小,但这些方法并未被调用。应用程序只显示工具栏和空白卡,尽管有两个记录或项目要显示。

      过去几天一直在盯着这些日志,没有任何进展或线索。非常感谢您的专家建议或指导(以及为了保存我的理智留下的东西)!

1 个答案:

答案 0 :(得分:1)

最后,Jared Burrows's advice驱使棺材里钉了最后一颗钉子。 BoyOboy,唯一正确的方法是战斗! ( ......几乎总是!

虽然我无法确定出错的地方,但这就是我重新做的事情:

  1. RecyclerView中仅使用 CardView - Fragment组合创建了一个全新的项目。从它带来的清晰度来看,非常值得花时间和精力。
  2. 阅读this very good resource
  3. 切换回我的应用的ListView实现,先将CardView权限改为ListView
  4. RecyclerView有了全新的理解,系统地将所有ListView代码替换为RecyclerView对应
  5. 在应用中,自定义RecyclerAdapterViewHolder现在就位于他们自己的独立课程中
  6. "RecyclerView: No Adapter attached; skipping layout”错误而被卡住了几个小时; Fragment中没有出现任何内容。那是Jared Burrows's advice投入的时候。
  7. RecyclerView正在寻找所有笨拙的海鲂,等待掀起下一个挑战:动画!