gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:51:52 25 4
gpt4 key购买 nike

这个问题已经被打了一百万次了,但不幸的是,没有任何关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com