2017-08-31 38 views
0

私はRecyclerViewを持っています。ユーザがアイテムをクリックすると、そのアイテムが選択され、そのIDがJSON配列に保存されます。同様に、ユーザーが項目を選択して後でそれを選択解除することを決定した場合、その項目をJSON配列から削除し、更新された配列を作成する必要があります。私はonClickでJSON配列を作成できますが、!onClickではJSON配列からJSONオブジェクトを削除できません。AndroidのonClickのJSON ArrayからJSONオブジェクトを削除する

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

private Context context; 
private List<ClientListData> clientListData; 
public JSONArray clientArray = new JSONArray(); 

public ClientListAdapter(List<ClientListData> clientListData, Context context) { 
    super(); 

    this.clientListData = clientListData; 
    this.context = context; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.client_list_item, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ClientListAdapter.ViewHolder holder, final int position) { 

    final ClientListData clientListDataModel = clientListData.get(position); 
    holder.clientList.setText(clientListDataModel.getClientName()); 

    holder.itemView.setBackgroundColor(clientListDataModel.isSelected() ? Color.GRAY : Color.WHITE); 
    holder.clientList.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      clientListDataModel.setSelected(!clientListDataModel.isSelected()); 

      try { 
       JSONObject clientObject = new JSONObject(); 
       if(clientListDataModel.isSelected()) { 
        holder.itemView.setBackgroundColor(Color.GRAY); 
        clientObject.put("id", clientListData.get(position).getClientId()); 
        clientArray.put(clientObject); 
       } 

       if(!clientListDataModel.isSelected()) { 

        holder.itemView.setBackgroundColor(Color.WHITE); 

        for(int i=0; i<clientArray.length(); i++) { 
         clientObject = clientArray.getJSONObject(i); 
         clientObject.remove(clientListData.get(position).getClientId()); 
         //clientArray.put(clientObject); 
        } 
       } 
       //clientArray.put(clientObject); 

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

      Log.e("client id array", ""+clientArray); 

     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return clientListData == null ? 0:clientListData.size(); 
} 

class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView clientList; 

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

     clientList = (TextView) itemView.findViewById(R.id.tv_client_list); 

    } 
} 

}ここ

とは私のモデルクラスである:私はブール変数を作成している

public class ClientListData { 

private String clientId; 
private String clientName; 
private boolean isSelected = false; 

public String getClientId() { 
    return clientId; 
} 

public void setClientId(String clientId) { 
    this.clientId = clientId; 
} 

public String getClientName() { 
    return clientName; 
} 

public void setClientName(String clientName) { 
    this.clientName = clientName; 
} 

public boolean isSelected() { 
    return isSelected; 
} 

public void setSelected(boolean selected) { 
    isSelected = selected; 
} 

}

注ここで

は私のアダプタクラスですonClicksを聴くモデルクラス。

注: -私はorg.json使用しておりますので、私はthis質問に出くわした検索の多くの後、JSONの配列にremoveメソッドを使用することはできませんよ。

+0

はない 'JSONArray番号のremove(int型のインデックス)'動作しますか? – pskink

+0

JSONArrayの代わりにArrayListを使用し、送信時にJSONArrayに変換します –

+0

@pskink私はそれを試していませんが、私の瞬間を与えてください、しかし、私の要求は、私がclientObject.remove(clientListData .get(position).getClientId()); – localhost

答えて

2

これを試してみてください:[UPDATE]

if (!clientListDataModel.isSelected()) { 

      holder.itemView.setBackgroundColor(Color.WHITE); 

      for (int i = 0; i < clientArray.length(); i++) { 
       clientObject = clientArray.getJSONObject(i); 
       if (clientObject.getString("id").equals(clientListDataModel.getClientId())) { 
        clientArray=removeFromJsonArray(clientArray,i); 
        break; 
       } 
      } 
     } 

removeFromJsonArray機能:

private JSONArray removeFromJsonArray(JSONArray array,int position){ 
if(array==null)return null; 
JSONArray newArray = new JSONArray(); 
      for (int i=0;i<array.length();i++) 
      { 
       //Excluding the item at position 
       if (i != position) 
       { 
        newArray.put(jsonArray.get(i)); 
       } 
      } 
     return newArray; 
    } 
+0

あなたのメソッドを試しましたが、clientArray.remove(i)でエラーが発生しました。removeメソッドがorg.jsonによってサポートされていないと思います。 – localhost

+0

removeFromJsonArray関数を試してみましょう。 – localhost

+0

位置は、clientArrayで見つかったそのclientObjectのインデックスです。 Idは配列内のオブジェクトの位置とは関係ありません –

0
Add This code in activity 


    private ArrayList<Integer> selectedIdList = new ArrayList<>(); 


    ClientListAdapter adapter=new ClientListAdapter (list,this,new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int position=(Integer)v.getTag(); 
       if(list.size()>position){ 
       ClientListDataModel clientListDataModel=list.get(position); 
    if clientListDataModel!= null) { 
       clientListDataModel.setSelected(!clientListDataModel.isSelected()); 

         boolean isSelected = clientListDataModel.isSelected(); 
         if (!isSelected) { 
          if (selectedIdList.contains(clientListDataModel.getId())) { 
           int index = selectedIdList.indexOf(clientListDataModel.getId()); 
           selectedIdList.remove(index); 
          } 
         } else { 
          if (!selectedIdList.contains(clientListDataModel.getId())) { 
           selectedIdList.add(clientListDataModel.getId()); 
          } 
         } 

        } 
       adapter.notifyItemChanged(pos); 
    } 
     }); 


    And at sending time 



     public JSONArray clientArray = new JSONArray(); 
     if(!selectedIdList.empty()){ 
      for(int i=0; i<selectedIdList.size(); i++) { 
       JSONObject clientObject = new JSONObject(); 
       clientObject.put("id", selectedIdList.get(i)); 
       clientArray.put(clientObject); 

      } 
     } 



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

    private Context context; 
    private List<ClientListData> clientListData; 
    public JSONArray clientArray = new JSONArray(); 
    OnClickListener onClickListener; 
    public ClientListAdapter(List<ClientListData> clientListData, Context context,OnClickListener onclick) { 
     super(); 

     this.clientListData = clientListData; 
     this.context = context; 
onClickListener=onclick; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.client_list_item, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final ClientListAdapter.ViewHolder holder, final int position) { 

     final ClientListData clientListDataModel = clientListData.get(position); 
     holder.clientList.setText(clientListDataModel.getClientName()); 

     holder.itemView.setBackgroundColor(clientListDataModel.isSelected() ? Color.GRAY : Color.WHITE); 
holder.clientList.setTag(position); 
     holder.clientList.setOnClickListener(onClickListener); 
    } 

    @Override 
    public int getItemCount() { 
     return clientListData == null ? 0:clientListData.size(); 
    } 

    class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView clientList; 

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

      clientList = (TextView) itemView.findViewById(R.id.tv_client_list); 

     } 
    } 
+0

あなたのソリューションをありがとう、私もそれを見てください – localhost

+0

あなたが提供したソリューションは印象的ですが、値を送信するボタンは、レイアウトファイルのRecyclerView要素のすぐ下にある私のアクティビティクラスにあります。 clientArrayを転送するインターフェイスを作成し、アクティビティクラスにインターフェイスを実装しました。今、私はどのように実際の配列をアクティビティクラスに入れるのか分かりません – localhost

+0

あなたのclicklistenerをアクティビティ/フラグメントに書くのはアダプターではなくちょうどclicklistenerのリファレンスをアダプターに渡してアクティビティでコールバックします –

関連する問題