transfer checked items in list-view to another lis

2019-09-11 09:30发布

I have a listview with data using customAdapter.class now what i want is that to transfer checked items in listview to secondActivity on button click...

 btest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SparseBooleanArray checked = listView.getCheckedItemPositions();
            ArrayList<Model> mylist = new ArrayList<Model>();
             for (int i = 0; i < checked.size(); i++) {
                    int position = checked.keyAt(i);
                    if (checked.valueAt(i))
                        // listView = new ArrayList<Model>();
                        mylist.add(String.valueOf(adapter.getItem(position)));

                }
                String[] output = new String[mylist.size()];
                for (int i = 0; i < mylist.size(); i++) {
                    output[i] = (mylist.get(i));

                }
                Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
                Bundle b = new Bundle();
                b.putStringArray("selectedItems", output);
                // b.putStringArrayList("SelectedItems: ",list);
                // b.putString("selectedItems", String.valueOf(output));
                intent.putExtras(b);
                startActivity(intent);*/
            }
    });

and this is the second activity where i am getting that data in another listview

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.result);
    Bundle b = getIntent().getExtras();
    String[] result = b.getStringArray("selectedItems");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, result);
    lv.setAdapter(adapter);
}

2条回答
欢心
2楼-- · 2019-09-11 09:59

The method you followed to send custom list to another activity will not work. In order to transfer your custom list between activities you need to create Parcelable List and send it through intent.

Android Intents does not support custom list.

Custom list can be passed in two ways, Serialization and Parcelable. But Parcelable is more Efficient and Simple to implement.

Refer this link to send custom list between activities through Parcelable

This link will give you much better idea to implement Parcelable.

Updated Code: Change your Model Code like below.

 public class Model implements Parcelable{
    private String name;
    private int selected;

    public Model(String name){
        this.name = name;
        selected = 0;
    }

    public String getName(){
        return name;
    }

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

@Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
    * Storing the Student data to Parcel object
    **/
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(selected);

    }

 private Model (Parcel in){
        this.name = in.readString();
        this.selected = in.readInt();
    }

public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() {

        @Override
        public Student createFromParcel(Parcel source) {
            return new Student(source);
        }

        @Override
        public Model[] newArray(int size) {
            return new Model[size];
        }
    };
}

Then in the MainActivity do this..

Intent next = new Intent(MainActivity , ResultActivity.class);
next.putParcelableArrayListExtra("model_data", (ArrayList<? extends Parcelable>) selectedItems);
startActivity(next);

In the ResultActivity do this.

ArrayList<Model> his = getIntent().getParcelableArrayListExtra("model_data");

Try the above code.. Good Luck..!!

查看更多
我命由我不由天
3楼-- · 2019-09-11 10:03

i solve by saving checked items from listview to sqlite on button click. another button to open new activity and call selected items sqlite this way... oncheckchange add and remove items in an arraylist and call this in onbutton click like this way...

  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder view = null;
    Support support = (Support) this.getItem(position);
    if (convertView == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.view_items, null);
        view = new ViewHolder();
        view.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
        view.cb = (CheckBox) convertView.findViewById(R.id.cb);
        convertView.setTag(view);

        view.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                CheckBox cb = (CheckBox) buttonView;
                Support support = (Support) cb.getTag();
                support.setSelected(cb.isChecked());
                if (isChecked){
                    selList.add(support.status);
                    selID.add(support.id);
                    selType.add(support.type);
                  //  Toast.makeText(CustomAdapter.this, "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), Toast.LENGTH_LONG).show();
                }else {
                    selList.remove(support.status);
                    selID.remove(support.id);
                    selType.remove(support.type);
                }
            }
        });
    }else{
        view = (ViewHolder) convertView.getTag();
        view.cb = view.getCb();
        view.tvInfo = view.getTvInfo();
    }
    view.cb.setTag(support);
    support = list.get(position);
    String id = support.getId();
    String status = support.getStatus();
    String type = support.getType();
    view.cb.setChecked(support.isSelected());
   // view.tvInfo.setText(id + "," + status + "," + type);
    view.tvInfo.setText(status);
    return convertView;
}

this is button coding to add to db

 btest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           handler.addSelected(adapter.selList, adapter.selID, adapter.selType);

and this is how to insert to sqlite..

public void addSelected(ArrayList<String> selList, ArrayList<String> selID, ArrayList<String> selType) {

    int size = selID.size();

    SQLiteDatabase db = getWritableDatabase();
    try{
       for (int i = 0; i < size ; i++){
            ContentValues cv = new ContentValues();
          //  cv.put(KEY_ID, selID.get(i).toString());
           cv.put(KEY_ID, selID.get(i));
             cv.put(KEY_STATUS, selList.get(i));
           cv.put(KEY_TYPE, selType.get(i));
            Log.d("Added ",""+ cv);
            db.insertOrThrow(TABLE_SELECTED, null, cv);
        }
        db.close();
    }catch (Exception e){
        Log.e("Problem", e + " ");
    }
}

and get back from db like this

 public ArrayList<String> getSelected() {
    SQLiteDatabase db = this.getReadableDatabase();
    ArrayList<String> result = null;
    try{
        result = new ArrayList<String>();
      //  String query = "SELECT * FROM " + TABLE_SELECTED;
        String query = "SELECT " + KEY_ID + " FROM " + TABLE_SELECTED;

        Cursor c = db.rawQuery(query, null);
        if (!c.isLast()){
            if (c.moveToFirst()){
                do{
                    String sel_name = c.getString(c.getColumnIndex("_id"));
                    result.add(sel_name);
                    Log.d("Added ", sel_name);
                }while (c.moveToNext());
            }
        }
        c.close();
        db.close();
    }catch (Exception e){
        Log.e("Nothing is to show", e + " ");
    }
    return result;
}
查看更多
登录 后发表回答