如何在不同的活动上使用GridView的相同适配器

时间:2016-06-10 08:44:01

标签: java android xml gridview

假设我有两项活动,活动A和活动B.

活动A使用适配器Z显示图像列表。

当用户点击活动A中的任何图片时,他们将被带到活动B以显示完整图像。我使用Intent将图像路径和网格位置传递给Activity。

现在在Activity B中,我放置了一个删除按钮,该按钮应该从gridview适配器中删除imagepath。

问题是: 如何访问活动B中的活动A适配器以调用适配器中的删除(位置)方法。

所以我可以在Activity A的onResume中调用notifyDataSetChanged来更新gridview图像。

活动A

MyGridView = (GridView) findViewById(R.id.gridview);
adapter = new MyAdapter(this);
MyGridView .setAdapter(adapter );    

Intent fullImageActivity = new Intent(getApplicationContext(), ActivityB.class);
    fullImageActivity.putExtra("position", position);
    fullImageActivity.putExtra("path", mediaPath);
    startActivity(fullImageActivity);

活动B

Intent i = getIntent();
// I'm getting position and path from setOnItemClickListener
position = i.getExtras().getInt("position");
path = i.getExtras().getString("path");

// I want to remove path from my adapter after clicking delete button in Activity B

适配器

public ArrayList<String> images;

    public void remove(int position){
            images.remove(position);
        }

3 个答案:

答案 0 :(得分:1)

使用startActivityForResult

Intent fullImageActivity = new Intent(getApplicationContext(), ActivityB.class);
    fullImageActivity.putExtra("position", position);
    fullImageActivity.putExtra("path", mediaPath);

   startActivityForResult(fullImageActivity, 2);

检查Activity B中的特定位置是否已删除。在这里我重写onBackPressed()(例如)方法

public void onBackPressed(){

   super.onBackPressed()

Intent intent=new Intent();  
                    intent.putExtra("isdeleted",true);  
intent.putExtra("pos",position);
                    setResult(2,intent);  
                    finish();
}

onActivityResult的{​​{1}}处理。

Activity A

对不起TYPO。

答案 1 :(得分:1)

这里的关键是你需要共享数据,而不是真正的适配器。

使用单身

您可以使用单例类来保存图像数据,然后在两个活动中访问它们。这样可以确保始终在两个活动之间同步。

Singleton Class

public class ImageData{
   private ArrayList<ImageModel> mDataOfImages;
   private ImageData mHelperInstance;

   private ImageData(){
         //private constructor to ensure singleton
   }

   public static ImageData getInstance(){
      // return an ImageData instance according to your implementation
      // of singleton pattern
   }

   private void setData(ArrayList<ImageModel> newData){
       this.mDataOfImages = newData;
   }

   private void removeImage(int position){
       if(this.mDataOfImages !=null && this.mDataOfImages.size() > position){
         mDataOfImages.remove(position);
     }
   }

}

活动A

private void saveImageData(ArrayList<ImageModel> data){
     if(data !=null){
          if(mAdapter !=null){
              mAdapter.setData(data);
          }
     }
}

//Call notifydatasetchanged when activity is opened again
@Override
protected void onStart() {
    if(mAdapter !=null){
        mAdapter.notifyDataSetChanged();
    }
}

MyAdapter

public void setData(ArrayList<ImageMode> newData){
     if(newData !=null){
        ImageDataSingleton.getInstance().setData(newData);
        notifyDataSetChanged();
     }
}

活动B

使用单例类在活动B中显示图像。因为您正在使用模型数组列表,所以您可以轻松实现向右/向左滑动并删除多个图像。

//Delete a image
private void deleteImage(){
     ImageDataSingleton.getInstance().removeImage(getCurrentPosition());
 // Rest of deletion handling like moving to right or left image
}

答案 2 :(得分:0)

我认为你应该在活动A中构建你的删除方法,并确保它是静态的:

public static void remove(int position){
        images.remove(position);
    }

现在您可以从活动B中调用它,如下所示:

ActivityA.remove(position);

我认为这会奏效。