java - 将 RecyclerView 的 getItemCount() 与 onCreateViewHolder 同步

标签 java android android-layout android-fragments

这个问题已经被打了一百万次了,但不幸的是,没有任何关于 SO 的答案可以帮助解决我的问题。

从根本上说,我的问题是,在 RecyclerView 中用CardViewFragment何时何处应执行以下任务:

  • 从服务器获取数据到用户设备上的本地数据库
  • 处理获取的本地数据
  • 实例化并设置 RecyclerView的适配器
  • 调用RecyclerViewnotifyfDataSetChanged()

RecyclerView在我的实现中,目前仅回调 getItemCount() . onCreateViewHolder()onBindViewHolder()永远不会被召回。 (我见过 this answer 和更多。)

这是它的完成顺序:

  1. AppCompatActivity实例化一个 Fragment
  2. Fragment的布局包含一个 RelativeLayout带有工具栏和 include ViewPager 的标签. ViewPager布局包含另一个 include使用 RecyclerView 设置布局的标签在LinearLayout .带有 CardView 的布局 XML设置在 RecyclerView的适配器:

        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;
    }
    
  3. 没有 ScrollView在任何布局中

  4. FragmentonCreate()调用从服务器获取数据的方法

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()
  1. 此数据被填充到用户设备上的本地数据库中
  2. Fragment 中的另一种方法的 onCreate()将本地数据过滤成 ArrayList
  3. ArrayList出现在 RecyclerView 中- CardView combo 终于给了用户。
  4. notifyDataSetChanged()在 fragment 的 onActivityCreated() 中调用.但事实是,它在调用它的任何地方都没有影响。此外,适配器在 onPostExecute() 中实例化的 AsyncTask创建 ArrayList对于 CardView来自本地数据库。

这是运行应用程序时产生的日志:

01-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查询处理如此获取的本地数据。

我在 onCreateViewHolder() 中有日志语句和 onBindViewHolder() .如上所述,尽管 getItemCount() 返回正值,但这些方法并未被调用。 ,这是 ArrayList 的大小.该应用程序仅显示工具栏和一张空白的白卡,尽管要显示两个记录或项目。

过去几天一直盯着这些日志看,没有任何进展或线索。非常感谢您的专家建议或指点(以及挽救我仅剩的理智)!

最佳答案

最后,是 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:未连接适配器;跳过布局” 错误而被困了几个小时; fragment 中没有显示任何内容。那是 Jared Burrows's advice 转换的时间里。

RecyclerView 现在看起来很笨拙,等待迎接下一个挑战:动画!

关于java - 将 RecyclerView 的 getItemCount() 与 onCreateViewHolder 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573330/

相关文章:

android - 如何接收华为运动健康App的数据?

java - TypedArray getColor 总是返回 defValue

Android:键入时保持 TextInputEditText 在 View 中

java - 使 ViewPager 可通过外部布局/从外部滑动

java - 使用 SimpleDateFormat 和 parsePosition 进行日期解析

java - 带 Java 的 Selenium WebDriver : How to wait for specific element to be visible located by multiple By objects?

java - 在 java 中解析 xml 时,跳过元素的反序列化并以字符串形式获取整个内容

安卓 Espresso : How do I test a specific Fragment when following one activity to several fragment architecture

java - Spring Annotation Based中根据key获取bean

android - 再次选择日期时,如何在 EditText 中显示最后选择的日期?