【问题标题】:findViewById() doesn't find RecyclerView in a second activityfindViewById() 在第二个活动中找不到 RecyclerView
【发布时间】:2018-02-26 22:44:42
【问题描述】:

我有一个带有 RecyclerView (trackingsRecycler) 的 MainActivity 和一个用于列出 CardView 的适配器,它工作正常。

当我点击某个卡片视图时,应用程序调用(使用 Intent)另一个活动 (DetailsActivity),它应该列出另一个 RecyclerView (detailsRecycler)。

但在 DetailsActivity 中的代码

RecyclerView detailsRecyclerView = findViewById(R.id.recycler_details_view);

没用

findViewById 返回 'null'

谁能帮帮我?

MainActivity.java

public class MainActivity extends AppCompatActivity {

public static final String TRACKING = "com.example.cooltracker.MESSAGE";
private RecyclerView recyclerView;
private TrackingsAdapter adapter;
private List<Tracking> trackingList;
private ProgressDialog pDialog;
private String webserviceURL;
private TextView total;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webserviceURL = "http://myWebServiceUrl.com/params";

    ---> recyclerView = findViewById(R.id.recycler_main_view); <--- Ok!!

    trackingList = new ArrayList<>();
    adapter      = new TrackingsAdapter(this, trackingList);

    total = findViewById(R.id.tvTotal);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 1);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addItemDecoration(new GridSpacingItemDecoration(1, dpToPx(5), true));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

    ... 

在 TrackingsAdapter.java 我把 clickListener 用来调用下一个屏幕

public class TrackingsAdapter extends RecyclerView.Adapter<TrackingsAdapter.MyViewHolder> {

      private Context mContext;
      private List<Tracking> trackingList;

      public class MyViewHolder extends RecyclerView.ViewHolder {...}

      @override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
             View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.tracking_card, parente, attachToRoot:false);
             final MyViewHolder mViewHolder = new MyViewHolder(itemView);

             return new MyViewHolder(itemView);
       }

       @Override
       public void onBindViewHolder(final MyViewHolder...){
             ...
             ...
             ...

             //Here I set the click listener
             holder.card.setOnClickListener(new View.OnClickListener() {

             @Override
             public void onClick(View view) {
                    getDetails(tracking.getTrack());
             }
       });

       private void getDetails(String tracking){

               //Call next screen DetailsActivity...
               Intent intent = new Intent(mContext, DetailsActivity.class);

               intent.putExtra(TRACKING, tracking);

               mContext.startActivity(intent);
       }

到目前为止,它运行良好!!!代码调用下一个屏幕...

但是……

在下一个屏幕上还应该有一个列表视图(RecyclerView)

DetailsActivity.java

public class DetailsActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private DetailsAdapter adapter;
    private List<Tracking> detailList;
    private ProgressDialog pDialog;
    private String webserviceURL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_details);

          //get intent
          Intent intent = getIntent();

          String tracking  = intent.getStringExtra(MainActivity.TRACKING);

          //set string in layout
          TextView tvHeaderLine1 = findViewById(R.id.tvHeaderLine1);
          tvHeaderLine1.setText(tracking);

          webserviceURL = "http://werService.com/otherAction";


          //THIS PART IS NOT WORKING ///
          ----> recyclerView = findViewById(R.id.recycler_detail_view); <----
          System.out.println(recyclerView); // It's always returning NULL

          detailList   = new ArrayList<>();
          adapter      = new DetailsAdapter(this, detailList);

          RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 1);
          //recyclerView.setLayoutManager(mLayoutManager);
          //recyclerView.setAdapter(adapter);

          // prepare the loading Dialog
          pDialog = new ProgressDialog(this);
          pDialog.setMessage("Message");
          pDialog.setCancelable(false);


          ...
          ...

    }

}

【问题讨论】:

  • 您确定在您的 DetailsActivity 布局中有名为 recycler_details_view 的东西吗?此外,findViewById(...) 前面不应该有正确的类型转换(即:(RecyclerView) ...)吗?
  • 你能把你的代码贴在这里
  • @KlingKlang 问题与此有关.. 谢谢

标签: java android android-recyclerview


【解决方案1】:

当 findViewById 返回 null 时,表示它在调用 setContentView() 时设置的布局内找不到具有指定 Id 的视图。

因此,基本上您在 setContentView() 方法中传递的布局没有带有“recycler_details_view”ID 的视图。

【讨论】:

    【解决方案2】:

    解决了!!!

    首先我想...如果我使用回收站,为什么我需要两个?我应该使用相同的...所以我设置了

    setContentView(R.layout.activity_main)

    在 DetailsActivity.class 上,我使用了相同的...谢谢!!!

    我现在会改进设计...

    屏幕在这里...我需要至少 10 声望才能发布图片...=/

    MainActivity Screen

    DetailsActivity Screen

    谢谢!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      相关资源
      最近更新 更多