Roboguice 视图注入:在 RecyclerView 适配器中注入自定义视图失败

Roboguice view injection : Injecting custom view in RecyclerView Adapter fails

首先我应该提到我正在使用 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 没有正确初始化。有人可以帮忙吗?谢谢!!

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

您应该在 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;
        }
...
}

希望对您有所帮助!!