Android Studio如何访问适配器类中的列表

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

我正在尝试访问在适配器类中创建的配方列表,以在其上处理可过滤的结果。无论我尝试过什么,似乎都无法将这份清单放到我需要的地方。如果有人能启发我如何在整个课堂上获得这份清单,我将非常高兴。

在我的适配器类中,已初始化的列表mRecipe中包含1个元素(这是正确的),但是当我在适配器类中的其他任何地方调用mRecipe时,它内部都包含0个元素。这是我的活动课。

public class SearchResultActivity extends AppCompatActivity {
private static final String TAG = "SEARCH RESULTS";
private RecipeViewModel mRecipeViewModel;
public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;
private RecipeListAdapter mAdapter;
private RecipeDao recDao;
private List<Recipe> recipelist = new ArrayList<Recipe>();
//List of Recipes
 private List<Recipe>  RecipeListFull = new LinkedList<Recipe>();
private TextView response;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_result);
    mAdapter = new RecipeListAdapter(this, recipelist);

    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);
    mRecipeViewModel.getAllRecipes().observe(this, new Observer<List<Recipe>>() {
        @Override
        public void onChanged(@Nullable final List<Recipe> recipeList) {
            // Update the cached copy of the words in the adapter.
             mAdapter.setWords(recipeList);
             Log.d(TAG , "SET WORDS: " + recipeList.size());
        }});
    Log.d(TAG, "recipe list size: " + recipelist.size());
    String query = getIntent().getStringExtra("Search");
    Log.d(TAG, "Query String: " + query);
    response = (TextView) findViewById(R.id.filler);

    int count = 0; //Replace this somehow
     response.setText(count + " Recipes were found with the query " + query);
    mAdapter.getFilter().filter(query); {

        }}}

这是我的适配器类

public class RecipeListAdapter extends RecyclerView.Adapter<RecipeListAdapter.RecipeViewHolder> implements Filterable {
private static final String TAG = "ADAPTER";
private OnItemClickListener mListener;
public List<Recipe> mRecipes = new ArrayList<Recipe>();
private List<Recipe> fullRecipes;
private RecipeViewModel viewModel;

public Recipe getRecipeAtPosition(int position) {
    return mRecipes.get(position);
}


public interface OnItemClickListener{
    void onItemClick(int position, View view);
}
public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

class RecipeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private final TextView recipeItemView;
    private RecipeViewHolder(View itemView) {
        super(itemView);
        recipeItemView = itemView.findViewById(R.id.textView);

        Log.d(TAG, "Size of Array in Adapter:" + mRecipes.size());
        itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (mListener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        mListener.onItemClick(position, v);
                    }
                }
            }
        });
    }

    @Override
    public void onClick(View view) {
        mListener.onItemClick(getAdapterPosition(), view);
    }
}
private final LayoutInflater mInflater;


RecipeListAdapter(Context context, List<Recipe> mRecipes) {

    this.fullRecipes = mRecipes;
    Log.d(TAG, "Size of Full Recipes CONSTRUCTOR: " + fullRecipes.size());
    mInflater = LayoutInflater.from(context);
}

@Override
public RecipeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false);
    return new RecipeViewHolder(itemView);
}

@Override
public void onBindViewHolder(RecipeViewHolder holder, int position) {
    if (mRecipes != null) {
        Recipe current = mRecipes.get(position);
        holder.recipeItemView.setText(current.getName());
    } else {
        // Covers the case of data not being ready yet.
        holder.recipeItemView.setText("No Recipes");
    }
}

void setWords(List<Recipe> recipes){
    mRecipes = recipes;
    notifyDataSetChanged();
}

public void deleteItem(final int position) {
    mRecipes.remove(position);
    notifyItemRemoved(position);
}
public void updateItem(Recipe recipe) {
    mRecipes.remove(recipe);
}
public List<Recipe> getList(){

    return mRecipes;
}


@Override
public int getItemCount() {
    if (mRecipes != null)
        return mRecipes.size();
    else return 0;
}
public interface OnNoteListener{}
@Override
public Filter getFilter() {
    return filter;
}
private Filter filter = new Filter(){

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        Log.d(TAG, "Length of fullRecipes " +fullRecipes.size());
       List<Recipe> filteredList = new ArrayList<>();
       Log.d(TAG, "Attempting to filter word: " + constraint);
       if (constraint.length() == 0){
           //Here should say 0 found
       }
       else {
           String filterPattern = constraint.toString().toLowerCase().trim();

           for (Recipe recipe : fullRecipes){
               if (recipe.getName().toLowerCase().contains(filterPattern)){
                   filteredList.add(recipe);
                   Log.d(TAG, "Filtered: " + filteredList.toString());
               }
           }
       }
       FilterResults results = new FilterResults();
       results.values = filteredList;
       return results;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
           mRecipes.clear();
            mRecipes.addAll((List)filterResults.values);
            Log.d(TAG, "Array Values! " + mRecipes.size());
            if (mRecipes.size() == 0){
                //No Matches have been found
            }
            else {
                notifyDataSetChanged();
            }
    }

};}

android list adapter
1个回答
0
投票

您可以在onChanged方法中添加mAdapter.notifyDataSetChanged();

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