想在其他Function中设置Recycle View的可见性但显示NullPointerException

问题描述 投票:0回答:1

MainActivity.java
onCreate
函数中,我设置了一个 Recycler View 作为 suggestList,并将其用作搜索建议。但是,我想设置它的
.setVisibility(View.GONE)
(当搜索建议完成时),因为在它下面我有一个
recyclerView
as (stockPriceList),它显示从 suggestList 添加到它的任何内容,并在
onCreate
之外创建了一个函数如
StockPrice()
所示,我尝试将 suggestList 的可见性设置为
GONE
但它显示 NullPointerException。当有人单击任何项目时,我也会调用 StockPriceAdapter 中的 StockPrice。

Here is the SS of Error

MainActivity.java

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

    suggestList = findViewById(R.id.suggestList);
    searchBar = findViewById(R.id.searchBar);
    stockModelClassesArray = new ArrayList<>();


    requestQueue = Volley.newRequestQueue(MainActivity.this);


    suggestList.setLayoutManager(new LinearLayoutManager(this));

    suggestAdapter = new stockSuggestAdapter(stockModelClassesArray, MainActivity.this, this);

    suggestList.setAdapter(suggestAdapter);

    searchBar.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            loadStockApi();
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    // Setting up Main Activity ArrayList.
    mainWatchList = findViewById(R.id.defaultWatchList);
    stockPriceList = new ArrayList<>();
    mainWatchList.setLayoutManager(new LinearLayoutManager(this));
    stockPriceAdapter = new StockPriceAdapter(stockPriceList, MainActivity.this);
    mainWatchList.setAdapter(stockPriceAdapter);

}

public void StockPrice(RecyclerView suggestList) {

    String name = Name;
    String Symbol = symbol;
    String price = "$20";

    stockPriceList = new ArrayList<>();

    if (stockPriceList != null) {
        // It's working
        stockPriceList.add(new defualtWatchListModel(name, Symbol, price));
        suggestList.setVisibility(View.GONE); //This Where I see the NullPointerExeception Error.
    }
}

这里是用于 suggestList (recyclerView) 的 Adapter 的 ViewHolderClass,我在此调用了 stockPrice() 函数。

 public class ViewHolder extends RecyclerView.ViewHolder {

    TextView symbol, name, exchange, type;
    public ConstraintLayout listContainer;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        name = itemView.findViewById(R.id.name);
        symbol = itemView.findViewById(R.id.symbol);
        exchange = itemView.findViewById(R.id.exchange);
        type = itemView.findViewById(R.id.type);
        listContainer = itemView.findViewById(R.id.search_item_views);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               itemOnClickListener.OnClickItemViewListener(getAbsoluteAdapterPosition());
               // Run this one
               MainActivity mainActivity = new MainActivity();
               mainActivity.StockPrice(mainActivity.suggestList);

            }
        });

    }
}

我正在尝试将 suggestList (RecyclerView) 的可见性设置为同一类中的 GONE,但在另一个函数中。

java android oop android-recyclerview
1个回答
0
投票

如果您尝试通过单击适配器的视图从适配器访问 MainActivity 中的功能,则必须在适配器中创建一个单击界面。在适配器中创建一个构造函数,其参数包含 OnClickListener 接口。

public class stockSuggestAdapter extends RecyclerView.Adapter<stockSuggestAdapter.ViewHolder> {

    Context context;

    ArrayList<StockModel> stockModelClassesArray;
    
    // Click interface I'm talking about
    View.OnClickListener onClickListener;
    
    // Create a constructor with 3 parameters, the third one being the click listener
    public stockSuggestAdapter(Context context, ArrayList<StockModel> stockModelClassesArray, View.OnClickListener onClickListener) {
        this.context = context;
        this.stockModelClassesArray = stockModelClassesArray;
        this.onClickListener = onClickListener;
    }

然后在你的ViewHolder中,写下这段代码:

public class ViewHolder extends RecyclerView.ViewHolder {

        TextView symbol, name, exchange, type;
        public ConstraintLayout listContainer;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.name);
            symbol = itemView.findViewById(R.id.symbol);
            exchange = itemView.findViewById(R.id.exchange);
            type = itemView.findViewById(R.id.type);
            listContainer = itemView.findViewById(R.id.search_item_views);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // We're going to make sure that the listener is not null so we won't get Null exception here
                    if (onClickListener != null){
                        onClickListener.onClick(v);
                    }
             
                }
            });
        }
    }

现在,在您的 MainActivity 上,创建适配器并将其设置为您的 recyclerView

// Create the click listener
View.OnClickListener itemClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Execute the function in your MainActivity
                StockPrice(suggestList)
} };
    
// Using the constructor we created earlier, we can now create the adapter for our recyclerview
suggestAdapter = new stockSuggestAdapter(MainActivity.this, stockModelClassesArray, itemClickListener);
    
// Lastly, set the adapter we have created to the recyclerView
suggestList.setAdapter(suggestAdapter);

您的代码中的问题是您的适配器中没有 recyclerview 引用。您在代码中所做的是创建了一个 NEW MainActivity,并且 MainActivity 不包含对您尝试访问的 recyclerView 的任何引用。如果您要在适配器中传递引用,请在适配器中创建构造函数或设置器。

© www.soinside.com 2019 - 2024. All rights reserved.