草庐IT

Android:RecyclerView 不显示 fragment 中的列表项

coder 2023-12-12 原文

谁能帮我尝试让我的 RecyclerView 出现。如果我不在 fragment 中实现它,它就会出现。但是,当我尝试将它实现到 fragment 中时,我在 (CarFront) 中的其他 XML 代码与 RecyclerView 分开显示。

我在日志中收到此错误: “E/RecyclerView:未连接适配器;跳过布局”

下面是我的代码,如果您需要任何其他信息或代码的其他部分,请随时在下面发表评论。非常感谢。

适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

    private List<ItemObject> itemList;
    private Context context;

    public RecyclerViewAdapter(Context context, List<ItemObject> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {

        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
        return rcv;

    }

    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        //holder.countryName.setText(itemList.get(position).getName());
        holder.photo.setImageResource(itemList.get(position).getPhoto());


    }

    @Override
    public int getItemCount() {

        Log.e("Test", "" + this.itemList.size());
        return this.itemList.size();

    }


}

fragment (欢迎):

public class Welcome extends AppCompatActivity {

    // Declaring variables
    private ViewPager viewPager;
    private ViewPagerAdapter viewPagerAdapter;
    private LinearLayout sectionLayout;
    private TextView[] sections;
    private int[] welcome_screen;
    private Button Skip, Next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Changing the window to fullscreen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_welcome);
        // Hiding the action bar to make it fullscreen
        getSupportActionBar().hide();

        // Setting the variables equal to their counter-part in the .xml
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        sectionLayout = (LinearLayout) findViewById(R.id.sections_layout);
        Skip = (Button) findViewById(R.id.skip);
        Next = (Button) findViewById(R.id.next);

        // Adding the various layouts to the welcome screen
        welcome_screen = new int[]{
                R.layout.activity_car_front,
                R.layout.activity_car_side};

        // adding sections
        SectionsDesign(0);

        viewPagerAdapter = new ViewPagerAdapter();
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);

        //RecyclerView
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.front_recyclerview);

    }


    public  void nextclick(View v)
    {

        // Checks to see if it has reached the homescreen, if so proceed
        int current = getItem(1);
        if (current < welcome_screen.length) {
            // moving to the next section
            viewPager.setCurrentItem(current);
        } else {
            launchHomeScreen();
        }
    }

    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            SectionsDesign(position);

            // When it reaches the last section, show launch button
            if (position == welcome_screen.length - 1) {
                // last page. make button text to GOT IT
                Next.setText("LAUNCH");
                Skip.setVisibility(View.GONE);
            } else {
                // Physical next button (blank for design)
                Next.setText("");
                Skip.setVisibility(View.VISIBLE);
            }
        }

        // Not using but need
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }
        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };

    private void SectionsDesign(int currentPage) {
        // Getting how many sections there are
        sections = new TextView[welcome_screen.length];

        sectionLayout.removeAllViews();
        for (int i = 0; i < sections.length; i++) {
            sections[i] = new TextView(this);
            // Shows how many sections there are
            sections[i].setText(Html.fromHtml("&#8226;"));
            // Size of the sections slider (dot)
            sections[i].setTextSize(35);
            // For other sections that isn't the one you are on
            sections[i].setTextColor(getResources().getColor(R.color.section_inactive));
            sectionLayout.addView(sections[i]);
        }

        if (sections.length > 0)
            // Change colour to active
            sections[currentPage].setTextColor(getResources().getColor(R.color.section_active));
    }


    private int getItem(int i) {
        return viewPager.getCurrentItem() + i;
    }

    // Method for switching to the main screen
    private void launchHomeScreen() {
        startActivity(new Intent(this, Form.class));
        finish();
    }

    public class ViewPagerAdapter extends PagerAdapter {
        private LayoutInflater layoutInflater;


        public ViewPagerAdapter() {

        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = layoutInflater.inflate(welcome_screen[position], container, false);
            container.addView(view);

            return view;
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == obj;
        }

        @Override
        // Number of sections
        public int getCount() {
            return welcome_screen.length;
        }


        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            View view = (View) object;
            container.removeView(view);
        }
    }

CarFront( fragment 中我的一个观点):

public class CarFront extends AppCompatActivity {

    private LinearLayoutManager lLayout;
    public static ImageView fbumper;
    public static ImageView hood;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //remove title/fullscreen
        //requestWindowFeature(Window.FEATURE_NO_TITLE);
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                //WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_car_front);
        setTitle(null);

        List<ItemObject> rowListItem = getAllItemList();
        lLayout = new LinearLayoutManager(CarFront.this);

        RecyclerView rView = (RecyclerView)findViewById(R.id.front_recyclerview);
        rView.setLayoutManager(lLayout);

        RecyclerViewAdapter rcAdapter = new RecyclerViewAdapter(CarFront.this, rowListItem);
        rView.setAdapter(rcAdapter);

        //Selected Images

        fbumper = (ImageView)findViewById(R.id.fbumperselected);
        hood = (ImageView)findViewById(R.id.hoodselected);




    }

    private List<ItemObject> getAllItemList(){

        List<ItemObject> allItems = new ArrayList<ItemObject>();

        allItems.add(new ItemObject("", R.drawable.hood_selected));

        //allItems.add(new ItemObject("", R.drawable.hood_card));


        return allItems;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder
    {

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }



}

CarFront(XML):

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/background">

    <android.support.v7.widget.Toolbar
        android:layout_width="fill_parent"
        android:layout_height="45dp"
        android:background="@drawable/top_logo">

    </android.support.v7.widget.Toolbar>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="200dp">

        <ImageView
            android:id="@+id/carfront"
            android:layout_width="368dp"
            android:layout_height="200dp"
            android:scaleType="fitStart"
            app:srcCompat="@drawable/carfront"
            tools:layout_editor_absoluteY="50dp"
            tools:layout_editor_absoluteX="8dp" />

        <ImageView
            android:id="@+id/hoodselected"
            android:layout_width="368dp"
            android:layout_height="200dp"
            android:scaleType="fitStart"
            app:srcCompat="@drawable/hood_selected"
            tools:layout_editor_absoluteY="50dp"
            tools:layout_editor_absoluteX="8dp"
            android:visibility="invisible"/>


        <ImageView
            android:id="@+id/fbumperselected"
            android:layout_width="368dp"
            android:layout_height="200dp"
            android:scaleType="fitStart"
            app:srcCompat="@drawable/fbumper_selected"
            tools:layout_editor_absoluteY="0dp"
            tools:layout_editor_absoluteX="8dp"
            android:visibility="invisible"/>

    </android.support.constraint.ConstraintLayout>



        <android.support.v7.widget.RecyclerView
            android:id="@+id/front_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="none" />


</LinearLayout>

RecyclerViewHolder:

    public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnTouchListener{

    //public TextView countryName;
    public ImageView photo;
    public ImageView fbumper;

    public RecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnTouchListener(this);
        photo = (ImageView)itemView.findViewById(R.id.cardview);
    }

    @Override
    //make a gesture detector
    //make a nice clean graphic after they tap on repair, telling the user how it works
    //pointer = multitouch
    public boolean onTouch(View view, MotionEvent event)
    {
        switch (event.getAction() & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
                actionDown();
                break;

            case MotionEvent.ACTION_POINTER_UP:
                actionUp();
                break;
        }

        return true;
    }

    // Method for Down Press
    public void actionDown()
    {
        switch (getAdapterPosition())
        {
            case 0:

                CarFront.fbumper.setVisibility(View.VISIBLE);
                break;

            case 1:
        }

    }
    //Method for Up Press
    public void actionUp()
    {
        switch (getAdapterPosition())
        {
            case 0:

                CarFront.fbumper.setVisibility(View.INVISIBLE);
                //break;

            case 1:
        }
    }


}

(我在尝试格式化和解释我的问题时很垃圾。但是,基本上我的 RecyclerView 没有显示在我的 fragment 中。它是为了显示 Cardview/s)

最佳答案

好的,首先,您的 Fragment 的结构应该更像下面这样。在您的 onCreateView 中,只需扩充布局,然后在 onViewCreated 中绑定(bind)/填充您的信息。

我们还使用 newInstance,因为这是创建新 Fragment 的标准方法。

请注意,我使用的是 android.support.v4.app.Fragment,而不是旧的 Fragment

public class CarFrontFragment extends Fragment {

    public ImageView bumper; // Do not use static views.
    public ImageView hood;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_car_front, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Bind your views.
        RecyclerView list = (RecyclerView) view.findViewById(R.id.front_recyclerview);
        bumper = (ImageView) view.findViewById(R.id.fbumperselected);
        hood = (ImageView) view.findViewById(R.id.hoodselected);

        // Create your layout manager.
        LinearLayoutManager layout = new LinearLayoutManager(getContext());
        list.setLayoutManager(layout);

        // Fetch your items.
        List<ItemObject> rowListItem = getAllItemList();

        // Set your adapter
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(getContext(), rowListItem);
        list.setAdapter(adapter);

    }

    // Creating a new Fragment through newInstance.
    public static CarFrontFragment newInstance() {
        return new CarFrontFragment();
    }


    // Fetching items, passing in the View they will control.
    private List<ItemObject> getAllItemList(){
        List<ItemObject> allItems = new ArrayList<ItemObject>();

        allItems.add(new ItemObject("", R.drawable.hood_selected), hood);
        allItems.add(new ItemObject("", R.drawable.bumped_selected), bumper);

        return allItems;
    }
}

现在,对于将包含这些内容的适配器,您需要一个 FragmentStatePagerAdapter。所有这一切都是将位置绑定(bind)到您选择的 Fragment

public class PagerAdapter extends FragmentStatePagerAdapter {

    public static final int NUM_OF_PAGES = 2;
    private static final int PAGE_WELCOME = 0;
    private static final int PAGE_CAR_FRONT = 1;

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case PAGE_WELCOME:
                // Return a new instance of your Fragment.

            case PAGE_CAR_FRONT:
                return CarFrontFragment.newInstance();
        }
        return null;
    }

    @Override
    public int getCount() {
        return NUM_OF_PAGES;
    }
}

在适配器中,我们要做的就是传递 ItemObject 控制的 View

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {

    private List<ItemObject> itemList;
    private Context context;

    public RecyclerViewAdapter(Context context, List<ItemObject> itemList) {
        this.itemList = itemList;
        this.context = context;
    }

    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_list, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
        return rcv;

    }

    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        holder.photo.setImageResource(itemList.get(position).getPhoto());
        // Telling the holder about the View.
        holder.view = itemList.get(position).getView();
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }
}

现在,在 RecyclerViewHolders 中,我们将使用 onTouch 切换 View 的可见性。

public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnTouchListener {

    ImageView photo;
    public View view;

    public RecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnTouchListener(this);
        photo = (ImageView) itemView.findViewById(R.id.cardview);
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                this.view.setVisibility(View.VISIBLE);
                break;

            case MotionEvent.ACTION_POINTER_UP:
                this.view.setVisibility(View.GONE);
                break;
        }

        return true;
    }

}

关于Android:RecyclerView 不显示 fragment 中的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45827981/

有关Android:RecyclerView 不显示 fragment 中的列表项的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

随机推荐