Android:RecyclerView不在片段中显示列表项 [英] Android: RecyclerView not showing List Items in a Fragment

查看:61
本文介绍了Android:RecyclerView不在片段中显示列表项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮助我尝试让我的RecyclerView出现.如果我没有在一个片段中实现它,它就会出现.但是,当我尝试将其实现为片段时,除了RecyclerView之外,其他(CarFront)中的XML代码都显示出来了.

Can someone help me try get my RecyclerView to appear. It appears if I do not implement it in a fragment. However, when I tried implementing it into a fragment my other XML code in (CarFront) was displayed apart from the RecyclerView.

我的日志中出现此错误: "E/RecyclerView:未连接适配器;正在跳过布局"

I'm getting this error in my log: "E/RecyclerView: No adapter attached; skipping layout"

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

Below is my code, if you need any other information or other sections of code please feel free to comment below. Thank you very much.

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();

    }


}

片段(欢迎使用):

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(我在片段中的观点之一):

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不在我的显示器中显示.它是要显示Cardview/s)

(I'm rubbish at trying to format and explain my problems. But, basically my RecyclerView is not displaying in my fragement. It is meant to display Cardview/s)

推荐答案

好的,首先,您的Fragment的结构应类似于以下内容.在onCreateView中,只需增加布局,然后在onViewCreated中,即绑定/填充信息.

Ok, first off, your Fragment should be structured more like the following. In your onCreateView, just inflate the layout, and then in onViewCreated, that's when you bind/populate your information.

我们还使用了newInstance,因为这是创建新片段的标准方法.

And we're also using newInstance, as that's the standard way to create new Fragments.

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

Note, I am using android.support.v4.app.Fragment, not the older 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.要做的就是将位置绑定到您选择的Fragment.

Now, as for your Adapter that will contain these, you want a FragmentStatePagerAdapter. All this will do is bind the position to a Fragment of your choosing.

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.

In the Adapter, all we're going to do is pass the View the ItemObject is controlling.

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切换视图的可见性.

And now, in the RecyclerViewHolders, we'll toggle the View's visibility with onTouch.

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不在片段中显示列表项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆