Activity.java中的多个选定项目RecyclerView [英] Multiple selected items RecyclerView in Activity.java

查看:128
本文介绍了Activity.java中的多个选定项目RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个RecyclerView,其中的数据来自CardView中的本地JSON.单击一个或某些项目(更改所选项目的背景或突出显示)(例如在Line App中进行编辑)但没有Button或longpress时,我需要对所选项目实施.但是我不想使用StateListDrawable或(使用XML),因为我有一些JSON数据需要稍后处理.

I have a RecyclerView with data from local JSON in CardView. I need to implement on selected items when one or some item clicked(change background the item selected or highlight) (like edit in Line App ) but without Button or longpress. But I don't want to use StateListDrawableor (using XML) because I have some JSON data which need to process later.

我需要Activity中的状态,例如布尔值或某种东西来保存我单击的每个项目,但是我再也没有任何解决方案.我已经阅读并尝试了一些教程,但是没有用.这是我现在的活动下面的内容:

I need a state in my Activity like a boolean value or something to save every item which I clicked but I don't have any solution again. I have read and try some tutorial but it's not working. This is below my Activity now :

adapter.setOnRecyclerViewClickedListener(new Adapter.OnRecyclerViewItemClickedListener() {
        @Override
        public void OnRecyclerViewItemClicked(int position) {
            boolean selectedItem = false;

            adapter.setOnRecyclerViewClickedListener(new Adapter.OnRecyclerViewItemClickedListener() {

        @Override
        public void OnRecyclerViewItemClicked(int position)  {

    /* ------ boolean variabel for adapter but still not work ----- */
            JSONObject filteredtableList= null;

            try {
                filteredtableList= new JSONObject("response").getJSONObject("tTisch");
            }
            catch (JSONException e) {
                e.printStackTrace();
            }

                if (recyclerView == null) {
                    try {
                        filteredtableList.has("true");
                        filteredtableList.put(status, true);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                else {
                    try {
                        filteredtableList.put(status, true);

                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            adapter.updateData(filteredTableList);

//----------------------------------------------------
            try {
                Toast.makeText(TableActivity.this, filteredTableList.getJSONObject(position).getString("tischnr"), Toast.LENGTH_SHORT).show();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });

Adapter.java

Adapter.java

public int lastCheckedPosition = -1;
.........
.........
.........
    @Override
public void onBindViewHolder(ViewHolder holder, int position) {

    if (position == lastCheckedPosition) {
        holder.itemView.setBackgroundResource(R.color.colorRedTableOcc);
    } else {
        holder.itemView.setBackgroundResource(R.color.colorTableGreen);
    }

    try {
        currItem = list.getJSONObject(position);
        holder.txt_no_table.setText(currItem.getString("tischnr"));

    } catch (JSONException e) {
        e.printStackTrace();
    }
}


@Override
public int getItemCount() {
    return list.length();
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView txt_no_table;

    public ViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        txt_no_table = (TextView) itemView.findViewById(R.id.txt_no_table_empty);
    }

    @Override
    public void onClick(View itemView) {

        recyclerViewItemClickedListener.OnRecyclerViewItemClicked(getAdapterPosition());

        lastCheckedPosition = getAdapterPosition();
        notifyItemRangeChanged(0,list.length());
    }
}

JSON.json

JSON.json

..............
"t-tisch": [
            {
                "tischnr": 1,
                "departement": 1,
                "normalbeleg": 0,
                "kellner-nr": 0,
                "bezeich": "TABLE 01",
                "roomcharge": false,
                "betriebsnr": 0
            },
            {
                "tischnr": 2,
                "departement": 1,
                "normalbeleg": 0,
                "kellner-nr": 0,
                "bezeich": "TABLE 02",
                "roomcharge": false,
                "betriebsnr": 0
            },
............

这是我的活动

现在输出:

当我单击该项目时,它会突出显示(感谢@Burhanuddin Rashid),但对我来说还是一半.我只能选择一个项目(我不能选择多个/更多项目).单击突出显示项时,我需要再次取消选择.

It's now highlight when I click the item (Thanks to @Burhanuddin Rashid) but its still half for my case. I only can select one item (I can't selected multiple/more items). I need to unselect again when I click the highlight item.

我尝试在JSON(上面的JSON代码)中写入新对象和键.按照我的逻辑,它将为每个项目是否被选中设置一个标志,但是仍然无法正常工作.

EDITED : I try to write new object and key in my JSON (JSON code above). In my logic, it will make a flag for every item is selected or not, but it still not work.

这是我的日志错误:

                  --------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.development_laptop.vhp_restotemp, PID: 3590
              java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.put(java.lang.String, boolean)' on a null object reference
                  at com.example.development_laptop.vhp_restotemp.TableActivity$1.OnRecyclerViewItemClicked(TableActivity.java:74)
                  at com.example.development_laptop.vhp_restotemp.com.example.development_laptop.vhp_restotemp.recyclerview.source.Adapter$ViewHolder.onClick(Adapter.java:97)
                  at android.view.View.performClick(View.java:5198)
                  at android.view.View$PerformClick.run(View.java:21147)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:148)
                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

推荐答案

我完全更改了代码,但是它现在可以正常运行,这里的代码如下:

I totally change my code but its now work powerfully, here my code looks like :

  1. 我将Adapter更改为通用适配器.它不处理任何数据,但是会扔给我的活动.

  1. I change my Adapter into generic adapter. Its not process any data, but its throw to my activity.

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
public int lastCheckedPosition = -1;

private static OnRecyclerViewItemClickedListener recyclerViewItemClickedListener;

public void setOnRecyclerViewClickedListener (OnRecyclerViewItemClickedListener l) {
recyclerViewItemClickedListener = l;
}

public interface OnRecyclerViewItemClickedListener {
  void OnRecyclerViewItemClicked(int position);
  void OnRecyclerViewItemBind(ViewHolder holder, int position);
  int OnRecyclerViewItemCount();

}
public Adapter() {
  super();
} 

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.table_item_empty, parent, false);
  return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
recyclerViewItemClickedListener.OnRecyclerViewItemBind(holder,position);
}

@Override
public int getItemCount() {
  return recyclerViewItemClickedListener.OnRecyclerViewItemCount();
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView txt_no_table;

public ViewHolder(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);

    txt_no_table = (TextView) itemView.findViewById(R.id.txt_no_table_empty);
}

@Override
public void onClick(View itemView) {

    recyclerViewItemClickedListener.OnRecyclerViewItemClicked(getAdapterPosition());
     }
   }
}

  • 我的Activity变成这样:

  • And My Activity become like this :

    /*Add Click Listener*/
    adapter.setOnRecyclerViewClickedListener(new Adapter.OnRecyclerViewItemClickedListener() {
    
        @Override
        public void OnRecyclerViewItemClicked(int position)  {
            try {
                JSONObject currTable = filteredTableList.getJSONObject(position);
    
                if (currTable.has("selected")) {
                    currTable.put("selected", !currTable.getBoolean("selected"));
                } else {
                    currTable.put("selected",true);
                }
    
                adapter.notifyItemChanged(position);
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            try
            {
                Toast.makeText(TableActivity.this, filteredTableList.getJSONObject(position).getString("tischnr"), Toast.LENGTH_SHORT).show();
            }
            catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void OnRecyclerViewItemBind(Adapter.ViewHolder holder, int position) {
            try {
                JSONObject currTable = filteredTableList.getJSONObject(position);
    
                holder.txt_no_table.setText(currTable.getString("tischnr"));
    
                int queasy33Index = ProgramMethod.getJSONArrayIndex(queasy33List,"number2", currTable.getInt("tischnr"));
    
                if (queasy33Index >= 0) {
                    holder.txt_no_table.setText(holder.txt_no_table.getText() + "-" +  queasy33List.getJSONObject(queasy33Index).getString("key"));
                }
    
                if (currTable.has("selected") && currTable.getBoolean("selected")) {
                    holder.itemView.setBackgroundResource(R.color.colorRedTableOcc);
                } else {
                    holder.itemView.setBackgroundResource(R.color.colorTableGreen);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    

  • 现在,点击侦听器将保存任何状态并保存到我的JSON文件中的布尔值中,如下所示:

  • Now the click listener save any state and save into boolean value in my JSON file like below :

    感谢大家提供建议和出色的答案:)

    Thanks to everyone with suggest and great answer :)

    这篇关于Activity.java中的多个选定项目RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆