Android - 从另一个 activity 添加对象到列表视图

Android - Adding objects to a list view from another activity

我有一个带有我自己的适配器的自定义列表视图。我可以在同一个 activity 中将对象添加到此列表,但我想做的是从另一个 activity 添加对象。在另一个 activity 中,有两个编辑文本框。一个负责正文,第二个负责描述,两个单选按钮决定图像。底部是添加按钮,应该将输入的数据添加到列表视图。

我试着用 Parcelable 来做这个,但我不知道具体如何实现它。下面是我的 ListView class:

public class Activity_4 extends AppCompatActivity {

private ListView listView;
private myAdapter mAdapter;

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

    listView = (ListView)findViewById(R.id.listView4);
    ArrayList<Object> objectList = new ArrayList<>();

    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));
    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));
    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));
    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));
    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));
    objectList.add(new Object(R.drawable.row_img, "After Earth" , "2013"));

    mAdapter = new myAdapter(this,objectList);
    listView.setAdapter(mAdapter);

}

public class Object implements Parcelable {
    int imageID;
    String mainText;
    String description;

    public Object (int imageID, String mainText, String description) {
        this.imageID = imageID;
        this.mainText = mainText;
        this.description = description;
    }

    public Object() {

    }

    public int getImageID() {
        return imageID;
    }
    public void setImageID(int imageID) {
        this.imageID = imageID;
    }
    public String getMainText () {
        return  mainText;
    }
    public void setMainText() {
        this.mainText = mainText;
    }
    public  String getDescription() {
        return  description;
    }
    public void setDescription() {
        this.description = description;
    }

    public Object(Parcel in) {
        this.imageID = in.readInt();
        this.mainText = in.readString();
        this.description = in.readString();

    }


    public final Parcelable.Creator<Object> CREATOR = new Parcelable.Creator<Object>() {
        @Override
        public Object createFromParcel(Parcel in) {
            return new Object(in);
        }

        @Override
        public Object[] newArray(int size) {
            return new Object[size];
        }
    };
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(imageID);
        dest.writeString(mainText);
        dest.writeString(description);
    }

}

public class myAdapter extends ArrayAdapter<Object> {

    private Context mContext;
    private List<Object> objectList = new ArrayList<>();

    public myAdapter(@NonNull Context context, ArrayList<Object> list) {
        super(context,0,list);
        mContext = context;
        objectList = list;
    }

    @NonNull
    @Override
    public View getView (int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItem = convertView;
        if (listItem == null)
            listItem = LayoutInflater.from(mContext).inflate(R.layout.list_row, parent, false);

        Object currentObject = objectList.get(position);

        ImageView image = (ImageView) listItem.findViewById(R.id.row_image);
        image.setImageResource(currentObject.getImageID());

        TextView mainTxt = (TextView) listItem.findViewById(R.id.row_tv1);
        mainTxt.setText(currentObject.getMainText());

        TextView description = (TextView) listItem.findViewById(R.id.row_tv2);
        description.setText(currentObject.getDescription());
        
        return listItem;
    }

}

谁能帮忙解决这个问题?

谢谢

一个好的起点可能是使用 startActivityForResult and pass the updates to the list to your adapter through the result, after you added everything you wanted by calling setResult with your new data. For further reference see Getting a Result from an Activity 启动您的 EditText activity。祝你好运!

您可以使用其他 Activity startActivityForResult() 并在 bundle 中传递 data 作为点击其他 Activity 的添加按钮的结果,因此当前 activity 会将数据添加到它的列表中。

正在调用其他Activity添加

startActivityForResult(intent,reqCode);

结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null && requestCode == reqCode) {
           Object object = new Object();
           object.setImageID(data.getIntExtra("image_id"));
           object.setMainText(data.getStringExtra("main_text");
           object.setDescription(data.getStringExtra("desc");
           objectlist.add(object);
           mAdapter.notifyDataSetChanged();
       }
}

其他Activity

public void onAddClick(){
  Intent intent = new Intent();
  intent.putIntExtra("image_id",*<value>*);
  intent.putStringExtra("main_text",*<value>*);
  intent.putStringExtra("desc",*<value>*);
  setResult(intent);
  finish();
}

从第一个 Activity 打开第二个 Activity 时

Intent mIntent=new Intent(this,YourSecondActivity.class);
startActivityForResult(mIntent,SOME_STATIC_INT)

在另一个activity 单击 AddButton

Intent mIntent=new Intent(this,YourFirstActivity.class);
mIntent.putExtra("DATA",Object)
setResult(SOME_STATIC_INT,mIntent)

现在是第一名Activity 覆盖Activity 结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null && requestCode == SOME_STATIC_INT) {
           Object object = data.getParcelableExtra("DATA")

           objectlist.add(object);
           mAdapter.notifyDataSetChanged();
       }
}