从回收站视图中获取多个选定的数据并将数据存储到数据库

Posted

技术标签:

【中文标题】从回收站视图中获取多个选定的数据并将数据存储到数据库【英文标题】:Get multiple selected data from recycler view and store the data to database 【发布时间】:2020-12-23 06:09:39 【问题描述】:

我有一个显示来自 json api 的数据的回收站视图。我将其设为多项选择,因此用户可以从列表中选择多个数据。当用户单击按钮时,我想使用 volley 将所选数据存储到我的数据库表的不同列中。

我已经做到了,但是存储在数据库中的数据是相同的,我的意思是每一列都存储了相同的数据。我想让每一列得到不同的数据。

例如:用户选择 3 个数据,例如 data1、data2 和 data3。当用户点击按钮时,存储在 db 上的数据是:

第 1 栏 |第 2 栏 |第 3 栏

数据1 |数据1 |数据1

数据2 |数据2 |数据2

数据3 |数据3 |数据3

我想要实现的是当用户点击按钮存储数据时,列将:

第 1 列 |第 2 列 |第 3 列

数据1 |数据2 |数据3

谁有解决办法?

在我的代码下面:

Activity.java

public class AddTagActivity extends AppCompatActivity 

private RecyclerView recyclerView;
private ArrayList<TagItem> tagItemArrayList = new ArrayList<>();
private TagAdapter adapter;
private Button save;
private String url = "http://agenproduk.dianarthaselaras.com/user/tag";

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

    save = findViewById(R.id.save);
    recyclerView = findViewById(R.id.tag_rview);

    int numberOfColumns = 2;
    //recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
    recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
    adapter = new TagAdapter(this, tagItemArrayList);
    recyclerView.setAdapter(adapter);

    getData();

    save.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            if (adapter.getSelected().size() > 0) 
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < adapter.getSelected().size(); i++) 
                    stringBuilder.append(adapter.getSelected().get(i).getTagList());
                    stringBuilder.append("\n");

                
                //showToast(stringBuilder.toString().trim());
                postTag(stringBuilder.toString().trim(), stringBuilder1.toString().trim(), stringBuilder2.toString().trim());
             else 
                //showToast("No Selection");
            
        
    );


private void getData()
    final ProgressDialog progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading...");
    progressDialog.show();

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    String URL_READ = url;
    System.out.print(URL_READ);
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL_READ,null,
            new Response.Listener<JSONObject>() 
                @Override
                public void onResponse(JSONObject response) 
                    progressDialog.dismiss();
                    System.out.println(response);
                    try
                        JSONArray jsonArray = response.getJSONArray("tag");
                        Gson gson = new Gson();
                        tagItemArrayList.clear();
                        for (int k = 0; k < jsonArray.length(); k++) 

                            JSONObject jsonObject = jsonArray.getJSONObject(k);
                            TagItem data = gson.fromJson(String.valueOf(jsonObject), TagItem.class);
                            tagItemArrayList.add(data);

                        
                        adapter.notifyDataSetChanged();
                        recyclerView.setAdapter(adapter);

                        progressDialog.dismiss();

                     catch (JSONException e) 
                        e.printStackTrace();
                        progressDialog.dismiss();
                        Toast.makeText(AddTagActivity.this, "Error "+e.toString(), LENGTH_SHORT).show();
                    
                

            ,
            new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 
                    progressDialog.dismiss();
                    Toast.makeText(AddTagActivity.this, "Error "+error.toString(), LENGTH_SHORT).show();
                
            )
    

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError 
            Map<String, String> params = new HashMap<String, String>();
            params.put("Accept", "application/json");
            return params;
        
    ;
    requestQueue.add(jsonObjectRequest);


private void showToast(String msg) 
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();


private void postTag(final String tag1, final String tag2, final String tag3)

    Intent intent = getIntent();
    final String idd = intent.getStringExtra("id");
    final String name = intent.getStringExtra("nama");

    String URL_REGISTER = "http://agenproduk.dianarthaselaras.com/user/addtag";
    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGISTER,
            new Response.Listener<String>() 
                @Override
                public void onResponse(String response) 
                    try
                        JSONObject jsonObject = new JSONObject(response);
                        new Handler().postDelayed(new Runnable() 
                            @Override
                            public void run() 
                            

                        , 3000);


                     catch (JSONException e)
                        e.printStackTrace();
                        Toast.makeText(AddTagActivity.this, "Failed" + e.toString(), Toast.LENGTH_SHORT).show();

                    
                
            ,
            new Response.ErrorListener() 
                @Override
                public void onErrorResponse(VolleyError error) 
                    Toast.makeText(AddTagActivity.this, "Failed" + error.toString(), Toast.LENGTH_SHORT).show();
                
            )

    

        @Override
        public String getBodyContentType() 
            return "application/x-www-form-urlencoded; charset=UTF-8";
        

        @Override
        public Map<String, String> getParams() 
            Map<String, String> params = new HashMap<>();
            params.put("userid", idd);
            params.put("user_name", name);
            params.put("tag1", tag1);
            params.put("tag2", tag2);
            params.put("tag3", tag3);
            params.put("Content-Type","application/x-www-form-urlencoded");
            return params;
        
    ;

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);


适配器.java

public class TagAdapter extends RecyclerView.Adapter<TagAdapter.TagViewHolder> 

private Context context;
private ArrayList<TagItem> tag;

public TagAdapter(Context context, ArrayList<TagItem> tag) 
    this.context = context;
    this.tag = tag;


public void setTag(ArrayList<TagItem> tag) 
    this.tag = new ArrayList<>();
    this.tag = tag;
    notifyDataSetChanged();


@NonNull
@Override
public TagViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) 
    View view = LayoutInflater.from(context).inflate(R.layout.item_tag, viewGroup, false);
    return new TagViewHolder(view);


@Override
public void onBindViewHolder(@NonNull TagViewHolder tagViewHolder, int position) 
    tagViewHolder.bind(tag.get(position));


@Override
public int getItemCount() 
    return tag.size();


class TagViewHolder extends RecyclerView.ViewHolder 

    private TextView textView;
    private ImageView imageView;

    TagViewHolder(@NonNull View itemView) 
        super(itemView);
        textView = itemView.findViewById(R.id.textView);
        imageView = itemView.findViewById(R.id.imageView);
    

    void bind(final TagItem tag) 
        imageView.setVisibility(tag.isChecked() ? View.VISIBLE : View.GONE);
        textView.setText(tag.getTagList());

        itemView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                tag.setChecked(!tag.isChecked());
                imageView.setVisibility(tag.isChecked() ? View.VISIBLE : View.GONE);
            
        );
    


public ArrayList<TagItem> getAll() 
    return tag;


public ArrayList<TagItem> getSelected() 
    ArrayList<TagItem> selected = new ArrayList<>();
    for (int i = 0; i < tag.size(); i++) 
        if (tag.get(i).isChecked()) 
            selected.add(tag.get(i));
        
    
    return selected;

【问题讨论】:

【参考方案1】:

如果选择了超过 3 个项目,我不知道您要发布哪些项目

if (adapter.getSelected().size() == 1) 
        postTag(adapter.getSelected().get(0).getTagList(), null, null);
     else if (adapter.getSelected().size() == 2) 
        postTag(adapter.getSelected().get(0).getTagList(),
                adapter.getSelected().get(1).getTagList(),
                null);
     else if (adapter.getSelected().size() > 2) 
        postTag(adapter.getSelected().get(0).getTagList(),
                adapter.getSelected().get(1).getTagList(),
                adapter.getSelected().get(2).getTagList());
    

【讨论】:

以上是关于从回收站视图中获取多个选定的数据并将数据存储到数据库的主要内容,如果未能解决你的问题,请参考以下文章

通过 URL 从 JSON 数据中获取数据并使用列表视图或回收器视图将其显示在 android 应用程序中

在回收站视图中滚动时,它向选定的复选框列表添加了一些其他值

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

Android ViewModel 未从 BackStackEntry 获取选定项

我如何从多个标签中获取多个数据,并将它们作为 json 存储在 javascript、jquery 中

使用异步任务时光标变为空?