代码之家  ›  专栏  ›  技术社区  ›  user5154488

从循环视图适配器引用上下文

  •  0
  • user5154488  · 技术社区  · 7 年前

    在每张卡片中,我想动态地将文本视图添加到该卡片内的线性布局中。

    这是RV适配器:

    public class RVAdapter extends RecyclerView.Adapter<RVAdapter.EventViewHolder>{
    
        Context context;
    
    
        List<Events> events;
        Calculations calculations = new Calculations();
        RVAdapter(List<Events> events){
            this.events = events;
        }
    
        @Override
        public int getItemCount() {
            return events.size();
        }
    
        @Override
        public EventViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
            EventViewHolder pvh = new EventViewHolder(v);
            return pvh;
        }
        @Override
        public void onBindViewHolder(EventViewHolder eventViewHolder, int i) {
            eventViewHolder.eventName.setText(events.get(i).getName());
            eventViewHolder.eventLocation.setText(events.get(i).getLocationName());
            eventViewHolder.eventDate.setText(calculations.UnixTimeConverter(events.get(i).getUnixTimeStamp())[0]);
            eventViewHolder.eventTime.setText(calculations.UnixTimeConverter(events.get(i).getUnixTimeStamp())[1]);
    
            //TODO(2):Change code to dynamically add textviews with the proper parameters to the LinearLayout;
            //eventViewHolder.eventParticipants.setText(calculations.ParticipantConcatenation(events.get(i).getParticipants()));
            for (String x: events.get(i).getParticipants()) {
                TextView tv=new TextView(context);
                LinearLayout.LayoutParams params=new LinearLayout.LayoutParams
                        (LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                params.leftMargin=50;
                params.topMargin=i*50;
                tv.setText(x);
                tv.setTextSize((float) 20);
                tv.setPadding(20, 50, 20, 50);
                tv.setLayoutParams(params);
                eventViewHolder.eventParticipants.addView(tv) ;
            }
        }
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }
    
    
        public static class EventViewHolder extends RecyclerView.ViewHolder {
            CardView cv;
            TextView eventName;
            TextView eventTime;
            TextView eventLocation;
            TextView eventDate;
    
            //TODO(1):Change the type of eventParticipants to Linear Layout;
            LinearLayout eventParticipants;
    
    
            EventViewHolder(View itemView) {
                super(itemView);
                cv = itemView.findViewById(R.id.CardViewItem);
                eventName = itemView.findViewById(R.id.event_name);
                eventTime = itemView.findViewById(R.id.event_time);
                eventDate = itemView.findViewById(R.id.event_date);
                eventLocation = itemView.findViewById(R.id.event_location);
                eventParticipants = itemView.findViewById(R.id.event_participants);
    
            }
    
        }
    
    }
    

    错误似乎出现在我实例化新TextView并在上下文中传递的地方。

    TextView中的TextView(android.context.context)不能应用于(…RVAdapter)

    我也试着通过一个

    MainActivity.this
    

    ,但这会导致生成时错误,显示“MainActivity.this not a enclosing class”

    如果我只是在上下文中传递,它会导致运行时NullPointerException错误:

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
                                                                                        at android.view.ViewConfiguration.get(ViewConfiguration.java:359)
                                                                                        at android.view.View.<init>(View.java:3587)
                                                                                        at android.view.View.<init>(View.java:3682)
                                                                                        at android.widget.TextView.<init>(TextView.java:637)
                                                                                        at android.widget.TextView.<init>(TextView.java:632)
                                                                                        at android.widget.TextView.<init>(TextView.java:628)
                                                                                        at android.widget.TextView.<init>(TextView.java:624)
                                                                                        at com.example.android.gatheraround.RVAdapter.onBindViewHolder(RVAdapter.java:56)
                                                                                        at com.example.android.gatheraround.RVAdapter.onBindViewHolder(RVAdapter.java:24)
                                                                                        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6400)
                                                                                        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6433)
                                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5377)
                                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5640)
                                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482)
                                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478)
                                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215)
                                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542)
                                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502)
                                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
                                                                                        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3625)
                                                                                        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3067)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
                                                                                        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1083)
                                                                                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:615)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.support.v4.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1417)
                                                                                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                                                        at android.support.v4.widget.NestedScrollView.onMeasure(NestedScrollView.java:482)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:713)
                                                                                        at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:785)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                                                        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
                                                                                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
                                                                                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                                                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
                                                                                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
                                                                                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
                                                                                        at android.view.View.measure(View.java:17547)
                                                                                        at android.view.ViewGroup.measureChildWithMarg
    08-15 19:27:17.358 3080-3080/com.example.android.gatheraround I/Process: Sending signal. PID: 3080 SIG: 9
    

    以下是主要活动和布局的代码(如果有帮助):

    public class MainActivity extends AppCompatActivity {
    
        Button eventListButton;
        private BottomSheetBehavior mBottomsheetbehvior;
        RecyclerView rv;
        LinearLayoutManager llm;
        Context context;
        public List<Events> events;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
    
            events = new ArrayList<Events>();
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //Find Button
            eventListButton = (Button) findViewById(R.id.eventlistbutton);
    
            //Find bottom sheet
            android.support.v4.widget.NestedScrollView bottomsheet =
                    (android.support.v4.widget.NestedScrollView) findViewById(R.id.bottomsheet);
    
            //Add bottomsheet behavior to view
            mBottomsheetbehvior = BottomSheetBehavior.from(bottomsheet);
            mBottomsheetbehvior.setHideable(true);
            mBottomsheetbehvior.setPeekHeight(400);
            mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_HIDDEN);
            eventListButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
                        mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                        eventListButton.setText("Hide");
                    }
                    else if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
                        mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_HIDDEN);
                        eventListButton.setText("Event List Button");
                    }
                    else if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
                        mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_EXPANDED);
                        eventListButton.setText("Peek");
                    }
                }
            });
    
            //Bottomsheet callbacks
            mBottomsheetbehvior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(@NonNull View bottomSheet, int newState) {
                    if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                        eventListButton.setText("Peek");
                    }
                    else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                        eventListButton.setText("Hide");
                    }
                    else if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                        eventListButton.setText("Event List Button");
                    }
                }
    
                @Override
                public void onSlide(@NonNull View bottomSheet, float slideOffset) {
    
                }
            });
    
            //Recyler View
            rv = (RecyclerView) findViewById(R.id.rv);
            rv.setHasFixedSize(true);
    
            llm = new LinearLayoutManager(context);
    
            String[] participants = {"Tamim","Chiharu","Azmain","Miyoshi"};
    
            events.add(new Events(1302719286,"U22 project",participants,new LatLng(37.652832,219.839478),"Saizeriya"));
            events.add(new Events(1502419296,"U22 project",participants,new LatLng(32.652832,19.839478),"Hiroo"));
            events.add(new Events(1901719266,"U22 project",participants,new LatLng(19.652832,39.839478),"Canada"));
            events.add(new Events(1204219286,"U22 project",participants,new LatLng(100.652832,13.839478),"Tokyo Monorail"));
            RVAdapter adapter = new RVAdapter(events);
            rv.setAdapter(adapter);
            rv.setLayoutManager(new LinearLayoutManager(context));
        }
    }
    

    主要活动

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/bgLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="0dp"
        android:paddingLeft="0dp"
        android:paddingRight="0dp"
        android:paddingTop="0dp"
        tools:context=".MainActivity">
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            >
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                >
                    <Button
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="8dp"
                        android:text="EventList Button"
                        android:id="@+id/eventlistbutton"
                        />
    
            </RelativeLayout>
        </ScrollView>
    
        <android.support.v4.widget.NestedScrollView
            android:id="@+id/bottomsheet"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="true"
            android:background="@color/recyclerview_background"
            app:layout_behavior="@string/bottom_sheet_behavior"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <android.support.v7.widget.RecyclerView
                    android:layout_height="match_parent"
                    android:layout_width="match_parent"
                    android:id="@+id/rv"
                    android:layout_marginLeft="@dimen/recyclerviewhorizontalpadding"
                    android:layout_marginRight="@dimen/recyclerviewhorizontalpadding"
                    >
    
                </android.support.v7.widget.RecyclerView>
    
            </LinearLayout>
    
        </android.support.v4.widget.NestedScrollView>
    
    </android.support.design.widget.CoordinatorLayout>
    

    和CardView:

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/CardViewItem"
        card_view:cardCornerRadius="@dimen/cardviewcorner"
        card_view:cardElevation="8dp"
        card_view:cardBackgroundColor="@color/cardbackground2"
        android:layout_marginTop="16dp"
    
        >
        <LinearLayout
            android:orientation="vertical" android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="@color/cardbackground"
                >
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="2"
                    tools:text="Dick Museum Tour"
                    android:textSize="18sp"
                    android:padding="@dimen/cardmargin"
                    android:textStyle="bold"
                    android:textColor="@color/white"
                    android:id="@+id/event_name"
                    />
                <TextView
                    android:layout_height="match_parent"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:textSize="18dp"
                    android:padding="@dimen/cardmargin"
                    android:textStyle="bold"
                    android:textColor="@color/white"
                    tools:text="8/24"
                    android:textAlignment="viewEnd"
                    android:id="@+id/event_date"
                    />
    
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="@dimen/card_view_height"
                android:background="@color/cardbackground2"
                android:orientation="vertical"
                >
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    tools:text="Time:"
                    android:textColor="@color/white"
                    android:textSize="18sp"
                    android:gravity="center_vertical"
                    android:paddingLeft="@dimen/cardmargin"
                    android:id="@+id/event_time"
                    />
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    tools:text="Location:"
                    android:textColor="@color/white"
                    android:textSize="18sp"
                    android:gravity="center_vertical"
                    android:paddingLeft="@dimen/cardmargin"
                    android:clickable="true"
                    android:id="@+id/event_location"
                    />
                <HorizontalScrollView
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    >
                    <!--TODO(3):Update the view as a Linear Layout-->
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:id="@+id/event_participants"
                        android:orientation="horizontal"
                        >
                    </LinearLayout>
                </HorizontalScrollView>
            </LinearLayout>
    
        </LinearLayout>
    </android.support.v7.widget.CardView>
    

    请注意,我尝试了一个版本的代码,我使用了TextView而不是LinearLayout,我将所有名称连接成一个完整的字符串,效果非常好。

    我现在尝试为每个名字创建一个TextView,并将其添加到线性布局中。

    4 回复  |  直到 7 年前
        1
  •  0
  •   an_droid_dev    7 年前

    在适配器内添加构造函数并设置上下文变量。

    public class RVAdapter extends RecyclerView.Adapter<RVAdapter.EventViewHolder> {
    
        Context context;
    
        public RVAdapter(Context context,...){
    
            this.context = context
        }
    }
    
    
    RVAdapter adapter = new RVAdapter(this,events);
    
        2
  •  0
  •   Shweta Chauhan    7 年前

    尝试以下操作:从活动传递上下文,并在适配器构造函数中获取它

    RVAdapter adapter = new RVAdapter(this,events); //add thia line in MainActivity.this
    

    RVAdapter(Context context,List<Event> event){
          this.context=context;
          this.events = events;
    }
    
        3
  •  0
  •   Oussema Aroua    7 年前

    Context 给你的 RVAdapter 构造函数如下:

    RVAdapter(List<Events> events, Context context){
        this.events = events;
        this.events = events;
    }
    
        4
  •  0
  •   Satan Pandeya Manoj ahirwar    7 年前

    EventViewHolder 这样地:

    public class EventViewHolder extends RecyclerView.ViewHolder {
        CardView cv;
        TextView eventName;
        TextView eventTime;
        TextView eventLocation;
        TextView eventDate;
    
        LinearLayout eventParticipants;
    
    
        EventViewHolder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.CardViewItem);
            eventName = (TextView) itemView.findViewById(R.id.event_name);
            eventTime = (TextView) itemView.findViewById(R.id.event_time);
            eventDate = (TextView) itemView.findViewById(R.id.event_date);
            eventLocation = (TextView) itemView.findViewById(R.id.event_location);
            eventParticipants = (LinearLayout) itemView.findViewById(R.id.event_participants);
    
        }
    
    }
    

    从传递上下文 MainActivity 课堂使用:

    RVAdapter adapter = new RVAdapter(events, this); 
    

    在您的 RVAdapter

    private Context context;
    private List<Event> events;
    RVAdapter(List<Event> events, Context context){
          this.events = events;
          this.context=context;
    }