【问题标题】:How to pass model type lists using intents from the adapter to another activity如何使用适配器的意图将模型类型列表传递给另一个活动
【发布时间】:2018-11-30 05:21:40
【问题描述】:

我有一个部门列表,其中包含部门名称,例如男士、女士等。现在假设我点击“女士”,下一个屏幕应该显示与部门相关的类别列表女士们 。 使用我现在的代码,只显示类别列表中的第一项。这是我的部门适配器代码:

public class Department_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static Context context;
private ArrayList<Department_model> arraylist;
private List<Department_model> models_list;


public Department_Adapter(Context context, List<Department_model> department_modelList) {
    this.models_list = department_modelList;
    this.arraylist = new ArrayList<Department_model>();
    this.arraylist.addAll(department_modelList);
    this.context = context;
}


public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.departments_childview, viewGroup, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {

    final ViewHolder myViewHolder = (ViewHolder)viewHolder;
    final Department_model model = models_list.get(i);
    myViewHolder.department_text.setText(model.getDepartment_Name());
    myViewHolder.relative_lay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, Categories.class);
            String items[] = new String[models_list.size()];
            for(int j=0; j< items.length; j++) {
                intent.putExtra("category_name", models_list.get(i).Category_Name);
                intent.putExtra("category_id", models_list.get(i).Category_ID);
                intent.putExtra("subCatName", models_list.get(i).Sub_Cat_Name);
                intent.putExtra("subcatID", models_list.get(i).Sub_Cat_ID);
                intent.putExtra("Article_ID", models_list.get(i).Article_ID);
                intent.putExtra("Article_Number", models_list.get(i).Article_Number);
                intent.putExtra("ArticleWSP", models_list.get(i).ArticleWSP);

                intent.putExtra("department_name", models_list.get(i).Department_Name);
            }
            context.startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return models_list.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView department_text;
    ImageView right_arrow;
    RelativeLayout relative_lay;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        department_text = (TextView) itemView.findViewById(R.id.department_text);
        right_arrow = (ImageView) itemView.findViewById(R.id.right_arrow);
        relative_lay = (RelativeLayout) itemView.findViewById(R.id.relative_lay);
    }
}

}

这是我的类别类:

public class Categories extends AppCompatActivity {
RecyclerView category_recyclerView;
TextView category_textview;
ImageView back_arrow;
static Context ctx;
private static List<Category_model> category_modelList;
private static List<String> list;
private Category_Adapter category_adapter;
String cat_name, cat_id, title, subCatName, subcatID, Article_ID, Article_Number, ArticleWSP;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_categories);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ctx = Categories.this;


        Intent intent = getIntent();
    cat_name = intent.getStringExtra("category_name");
    cat_id = intent.getStringExtra("category_id");
    subCatName = intent.getStringExtra("subCatName");
    subcatID = intent.getStringExtra("subcatID");
    Article_ID = intent.getStringExtra("Article_ID");
    Article_Number = intent.getStringExtra("Article_Number");
    ArticleWSP = intent.getStringExtra("ArticleWSP");

        title = intent.getStringExtra("department_name");


    category_recyclerView = (RecyclerView) findViewById(R.id.category_recyclerView);
    category_textview = (TextView) findViewById(R.id.category_textview);
    back_arrow = (ImageView) findViewById(R.id.back_arrow);
    category_textview.setText(title);

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    category_recyclerView.setLayoutManager(mLayoutManager);
    category_recyclerView.setItemAnimator(new DefaultItemAnimator());
    category_recyclerView.addItemDecoration(new DividerItemDecoration(Categories.this, DividerItemDecoration.VERTICAL));

    category_modelList = new ArrayList<>();





        Category_model obj1 = new Category_model();
        obj1.setCategory_Name(cat_name);
        obj1.setCategory_ID(cat_id);
        category_modelList.add(obj1);



        category_adapter = new Category_Adapter(Categories.this, category_modelList);
        category_recyclerView.setAdapter(category_adapter);



    back_arrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });


}

}

点击部门列表的特定位置时如何传递所有类别列表项?

【问题讨论】:

  • 发生这种情况是因为您的代码中存在逻辑问题。
  • 我知道。您能否指导我了解代码应该是什么?我是Android新手,因此很挣扎。谢谢 ! @AbdulWaheed
  • 请看我的回答,如果这有帮助,请告诉我。
  • 如果您有任何问题或疑问,请随时询问。

标签: android-intent android-listview android-adapter


【解决方案1】:

我可以在您的代码中看到逻辑问题。这是代码创建问题的一部分。

Intent intent = new Intent(context, Categories.class);
        String items[] = new String[models_list.size()];
        for(int j=0; j< items.length; j++) {
            intent.putExtra("category_name", models_list.get(i).Category_Name);
            intent.putExtra("category_id", models_list.get(i).Category_ID);
            intent.putExtra("subCatName", models_list.get(i).Sub_Cat_Name);
            intent.putExtra("subcatID", models_list.get(i).Sub_Cat_ID);
            intent.putExtra("Article_ID", models_list.get(i).Article_ID);
            intent.putExtra("Article_Number", models_list.get(i).Article_Number);
            intent.putExtra("ArticleWSP", models_list.get(i).ArticleWSP);

            intent.putExtra("department_name", models_list.get(i).Department_Name);
        }
        context.startActivity(intent);

在这里,您正在初始化 items 字符串数组,其大小为 model_list **。这没有意义。您的数组大小应该是 **Available Category 的大小,这里绝对没有人知道 category 的最后一个要多长时间 model_list 的长度可能有任何数字的匹配类别。所以,简单的数组不是一个好主意。您需要使用 ArrayList。自定义模式的ArrayList。这里自定义模型将是您的类别模式。如下所述

List<CategoryModel> categoryList = new ArrayList();

在点击的时候,你需要获取点击了哪个位置项的位置。然后你需要得到那个位置的模型对象。获得模型后,您需要找到实际的类别。对于类别,您需要选择 一个属性,例如该类别的 'name or id'。现在这将是您的过滤点。现在过滤您的 model_list (如果这也是包含您的类别的列表。我可以看到它是部门列表。如果此部门列表也包含类别,那么您需要使用列表来过滤列表) .要过滤您需要使用以下代码。

    Intent intent = new Intent(context, Categories.class);
    List<CategoryModel> categoryList = new ArrayList<>();
    //you need to get position of clicked item and that is stored in variable 'i'
    Department_model selectedModel = model_list.get(i);
    //here you have option you can filter with or the id let's suppose you are filtering with name then
    // get name of category
    String filterTag = selectedModel.Category_Name;
    for(int j=0; j< model_list.size(); j++) {
        //you need make category model with getter and setter properties
        if (filterTag.equalsIgnoreCase(selectedModel.Category_Name)) {
            CategoryModel  currentCategory = new CategoryModel();
            currentCategory.set(Category_Name);
            currentCategory.set(Category_ID);
            currentCategory.set(Sub_Cat_Name);
            currentCategory.set(Sub_Cat_ID);
            currentCategory.set(Article_ID);
            currentCategory.set(Article_Number);
            currentCategory.set(ArticleWSP);
            currentCategory.set(Department_Name);

            //here you have mapped category stuff in category model now you need to add in the list
            categoryList.add(currentCategory);
        }

    }

    Log.e("list_size",categoryList.size() );

    //after loop, you need to pass "categoryList" to the next activity and then use the same categoryList
    //to new activity of category adapter and now you are done ... phewww
    //you can use below code to pass list via intent 
    Bundle args = new Bundle();
    args.putSerializable("ARRAYLIST",(Serializable)categoryList);
    intent.putExtra("BUNDLE",args);
    context.startActivity(intent);

Category Activity onCreate() 方法使用下面的代码

Intent intent = getIntent();
Bundle args = intent.getBundleExtra("BUNDLE");
List<CategoryModel> list = args.getSerializable("ARRAYLIST");

现在已经完成了对这个列表做任何你想做的事情。

update 完成循环后,我正在检查列表大小。你需要检查尺寸,请告诉我

【讨论】:

  • 首先感谢您的赞美。就将列表从适配器传递到活动而言,如果您检查执行相同操作的代码的最后几行。
  • 非常感谢您的耐心等待。我尝试实现您的代码,但我只得到类别列表的第一个值。我认为我在设置类别模型时做错了。这就是我所做的,请你告诉我它是否错了?我认为由于我使用的是“第 i 个”位置,这就是为什么它具有相同的第一个值。 'currentCategory.setCategory_Name(models_list.get(i).Category_Name);'非常感谢!
  • 可能您的列表中只有一项属于该类别。首先,您需要在模型列表中检查您在循环中的次数。如果这不止一个,这意味着你有不止一个值,如果不是,那意味着你没有任何价值……如果你有更多的价值,那么让我知道。会尽力解决你的问题
  • 我刚刚检查过,循环正在迭代多次,但只添加了列表中的第一项。它不会移动到类别列表中的下一个项目。我稍微修改了我的代码, currentCategory.setCategory_Name(model.Category_Name);" 而不是 'currentCategory.setCategory_Name(models_list.get(i).Category_Name)'
  • 非常感谢!你不知道你是如何救了我的命的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多