【问题标题】:Roboguice view injection : Injecting custom view in RecyclerView Adapter failsRoboguice 视图注入:在 RecyclerView 适配器中注入自定义视图失败
【发布时间】:2016-07-12 16:22:03
【问题描述】:

首先我应该提到我正在使用 Roboguice。

我有一个Activity 和一个RecyclerView。我正在尝试在我的 RecyclerView's 适配器中填充自定义视图。我在我的项目中使用Roboguice

MainActivity.java

@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

     @InjectView(R.id.recycler_view) RecyclerView recyclerView;
     private UserAdapter mAdapter;

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


        ArrayList<User> users = fetchUsers();

        mAdapter = new UserAdapter(this,users);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(mAdapter);
}

UserAdapter.java

    public class UserAdapter extends RecyclerView.Adapter<UserAdapter.CustomViewHolder> {
      @Inject CustomView.Provider myViewProvider;

        private List<User> userList;
        private Context mContext;

        public UserAdapter(Context context, List<User> userList) {
            this.userList = userList;
            this.mContext = context;
        }

        @Override
        public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
            View view = myViewProvider.get(parent);

            CustomViewHolder viewHolder = new CustomViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(CustomViewHolder customViewHolder, int position) {
           ((CustomViewHolder) holder).init(userList.get(position));              

        }

        @Override
        public int getItemCount() {
            return (null != userList ? userList.size() : 0);
        }

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        private final CustomView myView;

        public CustomViewHolder(View itemView) {
            super(itemView);
            myView = (CustomView) itemView;
        }



public void init(final User user) {
            myView.init(user);
        }

        }
        }

CustomView.java

@ProvidedBy(CustomView.Provider.class)
public class CustomView extends RelativeLayout {

    private View caret;
    private TextView questionText;

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        caret = findViewById(R.id.view_caret);
        questionText = (TextView) findViewById(R.id.view_question);

    }

    public CustomView init(final User user) {
        this.user = user;
       //Set view
        return this;
    }


    public static class Provider extends ViewProvider<CustomView> {
        @Inject
        public Provider(LayoutInflaterWithInjection<CustomView> inflater) {
            super(R.layout.module_user, inflater);
        }
    }
}

所以当我运行它时,应用程序会崩溃。 日志 -

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.user.CustomView$Provider.get(android.view.ViewGroup)' on a null object reference
                                                                        at com.user.UserAdapter.onCreateViewHolder(UserAdapter.java:356)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5228)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4453)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:562)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2900)
                                                                        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3071)
                                                                        at android.view.View.layout(View.java:16678)

我猜这是因为我的 CustomView 没有正确初始化。有人可以帮忙吗?谢谢!!

【问题讨论】:

    标签: android android-custom-view android-recyclerview roboguice


    【解决方案1】:

    据我了解,您是在 RecyclerView 适配器内注入自定义视图,即 UserAdapter。 所以如果你想在你的适配器中注入自定义视图,那么你必须在你的活动中注入你的适配器。

    您应该更改您的MainActivity.java -

    public class MainActivity extends AppCompatActivity {
    
     @Inject UserAdapter mAdapter;
      @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
    
                ArrayList<User> users = fetchUsers();
                mAdapter.setUp(this,users);
                recyclerView.setLayoutManager(new LinearLayoutManager(this));
                recyclerView.setAdapter(mAdapter);
        }
    
    
    }
    

    你的适配器应该改变 -

    public class UserAdapter extends RecyclerView.Adapter<UserAdapter.CustomViewHolder> {
    @Inject CustomView.Provider myViewProvider;
    
            private List<User> userList;
            private Context mContext;
    
           @Inject
            public UserAdapter() {
            }
    
            public void setup(Context context, List<User> userList) {
                this.userList = userList;
                this.mContext = context;
            }
    ...
    }
    

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2012-04-04
      • 2020-06-01
      • 2017-07-20
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多