2016-08-08 36 views
0

Ich entwickle eine Android App, die eine benutzerdefinierte ListView mit einem Kontrollkästchen hat. Ich möchte alle überprüften Elemente von einer Aktivität zur nächsten weitergeben. Wie soll ich sie weitergeben? und wo sollte ich das Kontrollkästchen (um alle überprüften Elemente zu erhalten) im benutzerdefinierten Adapter oder der Aktivität verwalten?Get checked items id von benutzerdefinierten listview und übergebe sie an neue Aktivität android

Hinweis: Ich erhalte alle Daten von meinem Server mithilfe von JSON-Antwort.

Hier ist mein Modell:

public class Groups { 
     public String name; 
     public boolean selected= false; 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public boolean isSelected() { 
      return selected; 
     } 

     public void setSelected(boolean selected) { 
      this.selected = selected; 
     } 

     public Groups() { 
     } 
    } 

Mein Adapter:

public class AdapterMainActivity erweitert BaseAdapter {

Activity activity; 
private LayoutInflater inflater; 
List<Groups> groupsList; 

public AdapterMainActivity(Activity activity, List<Groups> groupses) { 
    this.activity = activity; 
    this.groupsList = groupses; 
} 

@Override 
public int getCount() { 
    return groupsList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return groupsList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (inflater == null) { 
     inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.custom_list, null); 
     TextView name = (TextView) convertView.findViewById(R.id.textViewName); 
     final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 

     final Groups groups = groupsList.get(position); 
     name.setText(groupsList.get(position).getName()); 

     checkBox.setChecked(groups.selected); 
     checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       groups.selected = isChecked; 
       MainActivity.getInstance().updateArrayList(groupsList); 
      } 
     }); 


    } 

    return convertView; 
} 

}

MainActivity:

public class MainActivity extends AppCompatActivity { 

    ListView listViewGroups; 
    Button buttonSentToActivity; 

    List<Groups> groupsList; 
    List<Groups> resultGroupList; 
    ArrayList<Boolean> areChecked; 
    List<String> finalArray; 

    private AdapterMainActivity adapterMainActivity; 

    static MainActivity yourActivity; 

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

     yourActivity = this; 

     groupsList= new ArrayList<Groups>(); 
     resultGroupList= new ArrayList<Groups>(); 

     ReadGroup(37); 

     adapterMainActivity = new AdapterMainActivity(this, groupsList); 

     listViewGroups = (ListView) findViewById(R.id.listViewGroups); 
     listViewGroups.setAdapter(adapterMainActivity); 

     buttonSentToActivity = (Button) findViewById(R.id.buttonSendTo2Activity); 
     buttonSentToActivity.setOnClickListener(buttonSentToActivityListener); 

     Log.e("Group list size ", String.valueOf(groupsList.size())); 
     finalArray = new ArrayList<>(); 
     for (int i = 0; i < resultGroupList.size(); i++) { 
      if (resultGroupList.get(i).selected) { 
       finalArray.add(resultGroupList.get(i).getName()); 
       Log.e("final array size", String.valueOf(finalArray.size())); 
      } 
     } 

    } 
    public void ReadGroup(long cid) { 
     Response.Listener<String> responseListener = new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONObject jsonObject = new JSONObject(response.toString()); 
        JSONArray readArray = jsonObject.getJSONArray("groups"); 

        for (int i = 0; i < readArray.length(); i++) { 

         Log.e("i is: ", String.valueOf(i)); 
         JSONObject jssonRow = readArray.getJSONObject(i); 

         String groupName = jssonRow.getString("name"); 

         Groups groups = new Groups(); 
         groups.setName(groupName); 
         Log.e("NAME is: ", groupName); 
         groupsList.add(groups); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       adapterMainActivity.notifyDataSetChanged(); 
      } 
     }; 

     Log.e("Client id is: ", String.valueOf(cid)); 
     ReadGroupRequesr readGroupRequest = new ReadGroupRequesr(cid, responseListener); 
     RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
     queue.add(readGroupRequest); 

     Log.e("out of the loop", ""); 
    } 

    public static MainActivity getInstance() { 
     return yourActivity; 
    } 

    public void updateArrayList(List<Groups> arrayList) { 
     this.resultGroupList = arrayList; 
    } 

    View.OnClickListener buttonSentToActivityListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //Bundle b= new Bundle(); 
      //b.putStringArrayList("arrayList", (ArrayList<String>) finalArray); 
      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      intent.putStringArrayListExtra("arrayList", (ArrayList<String>) finalArray); 
      //intent.putExtras(b); 
      Log.e("final array size", String.valueOf(finalArray.size())); 
      startActivity(intent); 
     } 
    }; 

} 
+0

Adapter OnClickListner, erhalten Index und Karte zu Array in Aktivität gespeichert. Ändern Sie den Kontrollkästchenstatus. Während Sie zu einer anderen Aktivität wechseln, übergeben Sie die ArrayList der überprüften Elemente – Stallion

+0

Bitte senden Sie einen Code, damit wir Sie für das gleiche führen können. – learner

+0

Ich habe gerade meinen Code geschrieben ... es funktioniert, aber das letzte Array ist immer null !! selbst wenn ich das Kontrollkästchen –

Antwort

0

Hier ist die Lösung für diese Frage:

Mein Adapter:

public class ChooseContactsAdapter extends BaseAdapter { 
private Activity activity; 
private LayoutInflater inflater; 
public ArrayList<Contacts> contactsList; 
public CheckBox checkBoxAdapter; 

public ChooseContactsAdapter(Activity activity, ArrayList<Contacts> group) { 
    this.activity = activity; 
    this.contactsList = group; 
} 

@Override 
public int getCount() { 
    return contactsList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return contactsList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (inflater == null) { 
     inflater = (LayoutInflater)    activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    if (convertView == null) { 

     convertView = inflater.inflate(R.layout.custom_choose_contacts_sms, 
    null); 

     final TextView fNAme = (TextView) convertView.findViewById(R.id.textViewCustomSMSSelectContactFName); 
     TextView LName = (TextView) convertView.findViewById(R.id.textViewCustomSMSSelectContactLName); 

     checkBoxAdapter = (CheckBox) convertView.findViewById(R.id.checkBoxSelectContact); 

     checkBoxAdapter.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       CheckBox cb = (CheckBox) view; 
       Contacts contacts = (Contacts) cb.getTag(); 
       contacts.setSelected(cb.isChecked()); 

       Toast.makeText(activity.getApplicationContext(), 
         "Clicked on Checkbox: " + cb.getText() + 
           " is " + cb.isChecked(), 
         Toast.LENGTH_LONG).show(); 

      } 
     }); 


     final Contacts contacts = contactsList.get(position); 


     fNAme.setText(contacts.getContactFName()); 
     LName.setText(contacts.getContactLName()); 
     checkBoxAdapter.setChecked(contacts.isSelected()); 
     checkBoxAdapter.setTag(contacts); 
    } 
    return convertView; 
    } 
    } 

In meiner Tätigkeit habe ich Taste gehen von 1-Aktivität auf die 2-Aktivität:

private View.OnClickListener buttonSubmitGroupListener =new  View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     List <Integer> contactsIDArray= new ArrayList<Integer>(); 
     List<Contacts> arrayOfContacts= chooseContactsAdapter.contactsList; 
     for(int i=0; i< arrayOfContacts.size(); i++){ 
      Contacts contacts= arrayOfContacts.get(i); 

      if(contacts.isSelected()==true){ 
       contactsIDArray.add(contacts.getContactID()); 
      } 
     } 

     for (int i = 0; i < contactsIDArray.size(); i++) { 
      Log.e("Id Array size ", String.valueOf(contactsIDArray.size())); 
      Log.e("Selected id ", String.valueOf(contactsIDArray.get(i))); 
     } 

     intent = new Intent(getApplicationContext(), SendSMSActivity.class); 
     Bundle b = new Bundle(); 
     b.putIntegerArrayList("checkedContacts", (ArrayList<Integer>) contactsIDArray); 
     intent.putExtras(b); 
     startActivity(intent); 
    } 
}; 

Zweite Aktivität diesen Code hinzufügen:

Bundle b = getIntent().getExtras(); 
    List<Integer> result = new ArrayList<Integer>(); 
    result = b.getIntegerArrayList("checkedContacts"); 
0

gleich bei der allerersten, verwalten Sie Ihre Kontrollkästchen:

In Aktivitätsklasse einen boolean-Array hinzufügen oder Arraylist Größe gleiche wie Ihre Liste Array Größe und sie alle Wert als falsch initialisiert zunächst:

String[] titlesArray; 
ArrayList<Boolean> arrChecked; 

// initialize arrChecked boolean array and add checkbox value as false initially for each item of listview 
    arrChecked = new ArrayList<Boolean>(); 
    for (int i = 0; i < titles.size(); i++) { 
    arrChecked.add(false); 
    } 

jetzt Ihre Adapterklasse mit diesem ersetzen:

class VivzAdapter extends ArrayAdapter<String> implements OnCheckedChangeListener { 
Context context; 
int[] images; 
String[] titlesArray, descrptionArray; 
List<Integer> positions = new ArrayList<Integer>(); 

ArrayList<Boolean> arrChecked; 

VivzAdapter(Context context, String[] titles, int[] images, String[] description, ArrayList<Boolean> arrChecked) { 

super(context, R.layout.single_row, R.id.textView1, titles); 
this.context = context; 
this.images = images; 
this.titlesArray = titles; 
this.descrptionArray = description; 
this.arrChecked = arrChecked; 

} 

class MyViewHolder { 
ImageView myImage; 
TextView myTitle; 
TextView myDescription; 
CheckBox box; 

MyViewHolder(View v) { 
    myImage = (ImageView) v.findViewById(R.id.imageView1); 
    myTitle = (TextView) v.findViewById(R.id.textView1); 
    myDescription = (TextView) v.findViewById(R.id.textView2); 
    box = (CheckBox) v.findViewById(R.id.checkBox1); 
} 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
View row = convertView; 
MyViewHolder holder = null; 
if (row == null) { 
    // 1.ºtime 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    //row contem RelativeLayout(root) em single_row.xml 
    row = inflater.inflate(R.layout.single_row, parent, false); 
    holder = new MyViewHolder(row); 
    row.setTag(holder); 
    //Log.d("VIVZ", "Creating a new Row"); 
} else { 
    //reciclamos aqui, qeremos usar antigo objecto holder 
    holder = (MyViewHolder) row.getTag(); 
    //Log.d("VIVZ", "Recycling stuff"); 
} 
holder.myImage.setImageResource(images[position]); 
holder.myTitle.setText(titlesArray[position]); 
holder.myDescription.setText(descrptionArray[position]); 

//set position as id 
holder.box.setId(position); 
//set onClickListener of checkbox rather than onCheckedChangeListener 
holder.box.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      int id = v.getId(); 

      if (arrChecked.get(id)) { 
       //if checked, make it unchecked 
       arrChecked.set(id, false); 
      } else { 
       //if unchecked, make it checked 
       arrChecked.set(id, true); 

      } 

     } 
    }); 

    //set the value of each checkbox from arrChecked boolean array 
    holder.box.setChecked(arrChecked.get(position)); 

return row; 
} 
} 

Danach klicken Sie Hörer von Sendetaste sagen btnSend Taste (ich erwäge implementieren, dass Sie senden Ihre Daten von einer Aktivität auf eine andere Tätigkeit auf Klick auf Senden-Button):

btnSend.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ArrayList<String> arrTempList = new ArrayList(); 
      for(int i=0; i<titles.size(); i++){ 
       if(arrChecked.get(i) == true){ 
        arrTempList.add(titles[i]); 
       } 
      } 

      // here you can send your arrTempList which is having checked items only 

     } 
    }); 
+0

aktiviert OnCheckedChangeListener .... Sie können dies nicht auf den Adapter hinzufügen, ohne es Methoden implementieren! –