【问题标题】:How to implement a Recycler View with CardView in a Fragment [Android - Java]?如何在 Fragment [Android - Java] 中使用 CardView 实现 Recycler View?
【发布时间】:2018-03-25 16:35:31
【问题描述】:

网上有很多关于这个的教程。但是,我尝试了很多,但没有一个能正确地完成我的预期。

我对 Android 和应用程序开发非常陌生,但有一些开发网站和 API 的经验。我开发了一个网站,并想创建一个简单的 Android 应用程序来为用户显示事件源。

因此,经过一些研究,有效处理来自 API 的大量 JSON 数据列表的最佳方法似乎是使用 RecyclerView,而 CardViews 会稍微提升设计。

所以我设置了一个带有底部导航栏的项目,并创建了三个选项卡(事件、配置文件和通知)。这些选项卡返回一个片段,列表应该在事件片段内。我已对其进行硬编码以显示 5 个项目,但它从不显示卡片。所以我不确定它错在哪里。其他片段正确显示

这是我的代码:

基本片段

public abstract class BaseFragment extends AppCompatActivity {

    protected abstract Fragment createFragment();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.content);

        if(fragment == null){
            fragment = createFragment();
            fm.beginTransaction()
                    .add(R.id.events_fragment_container, fragment)
                    .commit();
        }


    }
}

事件片段、适配器和 ViewHolder

public class EventsRecyclerFragment extends Fragment{

    public static Fragment newInstance(){
        return new EventsRecyclerFragment();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.events_recycler_view_fragment, container, false);

        RecyclerView recyclerView = view.findViewById(R.id.events_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(new EventsRecyclerViewAdapter());
        return view;

    }

    private class EventsRecyclerViewHolder extends RecyclerView.ViewHolder{
        private CardView mCardView;
        private TextView mTextView;

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

        public EventsRecyclerViewHolder(LayoutInflater inflater, ViewGroup container){
            super(inflater.inflate(R.layout.events_card_view, container, false));
            mCardView = itemView.findViewById(R.id.events_card_container);

        }
    }

    private class EventsRecyclerViewAdapter extends  RecyclerView.Adapter<EventsRecyclerViewHolder>{

        @Override
        public EventsRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            return new EventsRecyclerViewHolder(inflater, parent);
        }

        @Override
        public void onBindViewHolder(EventsRecyclerViewHolder holder, int position) {

        }

        @Override
        public int getItemCount() {
            return 5;
        }
    }
}

我在 Activity 上的使用情况

public class UserActivity extends AppCompatActivity {
    public static final String PREFS_NAME = "Preferences";
    private static final String PREF_EMAIL = "EMAIL";
    private static final String PREF_PASSWORD = "PASSWORD";
    private static final String PREF_TOKEN = "TOKEN";
    Button btnLogout;
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();


            switch (item.getItemId()) {
                case R.id.navigation_events:
                    transaction.replace(R.id.content, new EventsRecyclerFragment().newInstance()).commit();
                    return true;
                case R.id.navigation_profile:
                    transaction.replace(R.id.content, new UserFragment()).commit();
                    return true;
                case R.id.navigation_notifications:
                    transaction.replace(R.id.content, new NotificationsFragment()).commit();
                    return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
        btnLogout = (Button) findViewById(R.id.btnLogin);

        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    }

}

谁能帮助我如何让这个基本列表显示出来? 提前致谢

【问题讨论】:

  • 从 Fragment 发布您的 xml

标签: android android-layout android-fragments android-recyclerview android-cardview


【解决方案1】:

需要进行两项更改:

  1. UserActivity :从EventsRecyclerFragment() 实例初始化中删除new 关键字,因为newInstance() 方法本身返回一个新实例。

    public class UserActivity extends AppCompatActivity {
      public static final String PREFS_NAME = "Preferences";
      private static final String PREF_EMAIL = "EMAIL";
      private static final String PREF_PASSWORD = "PASSWORD";
      private static final String PREF_TOKEN = "TOKEN";
      Button btnLogout;
      private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
          = new BottomNavigationView.OnNavigationItemSelectedListener() {
    
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
          FragmentManager manager = getSupportFragmentManager();
          FragmentTransaction transaction = manager.beginTransaction();
    
    
          switch (item.getItemId()) {
     case R.id.navigation_events:
                    transaction.replace(R.id.content, EventsRecyclerFragment().newInstance()).commit();
                    return true;
                case R.id.navigation_profile:
                    transaction.replace(R.id.content, new UserFragment()).commit();
                    return true;
                case R.id.navigation_notifications:
                    transaction.replace(R.id.content, new NotificationsFragment()).commit();
                    return true;
          }
          return false;
        }
      };
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView navigation =  findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    
      }
    
    }
    
  2. EventsRecyclerFragment : 在初始化期间始终设置回收站视图的 orientation

     public class EventsRecyclerFragment extends Fragment{
    
            public static Fragment newInstance(){
                return new EventsRecyclerFragment();
            }
    
            @Nullable
            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.events_recycler_view_fragment, container, false);
    
                RecyclerView recyclerView = view.findViewById(R.id.events_recycler_view);
                LinearLayoutManager linearLayoutManager =new LinearLayoutManager(getActivity());
          linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                recyclerView.setLayoutManager(linearLayoutManager);
                recyclerView.setAdapter(new EventsRecyclerViewAdapter());
                return view;
    
            }
    
            private class EventsRecyclerViewHolder extends RecyclerView.ViewHolder{
                private CardView mCardView;
                private TextView mTextView;
    
                public EventsRecyclerViewHolder(View itemView) {
                    super(itemView);
                }
    
                public EventsRecyclerViewHolder(LayoutInflater inflater, ViewGroup container){
                    super(inflater.inflate(R.layout.events_card_view, container, false));
                    mCardView = itemView.findViewById(R.id.events_card_container);
    
                }
            }
    
            private class EventsRecyclerViewAdapter extends  RecyclerView.Adapter<EventsRecyclerViewHolder>{
    
                @Override
                public EventsRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    LayoutInflater inflater = LayoutInflater.from(getContext());
                    return new EventsRecyclerViewHolder(inflater, parent);
                }
    
                @Override
                public void onBindViewHolder(EventsRecyclerViewHolder holder, int position) {
    
                }
    
                @Override
                public int getItemCount() {
                    return 5;
                }
            }
        }
    

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多