在 android 中单击按钮将列表视图中的选中项目转移到另一个列表视图

transfer checked items in list-view to another list-view on button click in android

我有一个 listview 数据使用 customAdapter.class 现在我想要的是在点击按钮时将 listview 中的选中项目转移到 secondActivity...

 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);*/
            }
    });

这是我在另一个列表视图中获取数据的第二个 activity

 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);
}

您将自定义列表发送到另一个 activity 所采用的方法将不起作用。为了在活动之间传输您的自定义列表,您需要创建 Parcelable List 并通过 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.

更新代码:如下更改模型代码。

 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];
        }
    };
}

然后在 MainActivity 中执行此操作..

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

在 ResultActivity 中执行此操作。

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

试试上面的代码.. 祝你好运..!!

我通过单击按钮将选中的项目从列表视图保存到 sqlite 来解决。另一个按钮打开新 activity 并以这种方式调用选定的项目 sqlite ... oncheckchange 在 arraylist 中添加和删除项目,并在 onbutton click 中调用它,就像这样...

  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;
}

这是要添加到数据库的按钮编码

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

这就是插入 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 + " ");
    }
}

然后像这样从 db 返回

 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;
}