【问题标题】:How Can I use Same Adapter of a GridView on Different activities如何在不同的活动上使用 GridView 的相同适配器
【发布时间】:2016-06-13 16:56:01
【问题描述】:

假设我有两个活动,活动 A 和活动 B。

Activity A 使用 Adapter Z 显示图像列表。

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

现在在活动 B 中,我放置了一个删除按钮,该按钮应该从 gridview 适配器中删除图像路径。

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

所以我可以在 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);
        }

【问题讨论】:

  • 使用静态变量或共享首选项保存您在活动 B 中的位置。并在 Activity A 中从 arraylist 中删除位置并通知它
  • 是的,我知道这样做。但我想从 Activity B 本身中删除位置。
  • 你在Activity B中有gridview吗?
  • 不行,Activity B只有一个ImageView来显示Activity A点击的图片

标签: java android xml gridview


【解决方案1】:

使用startActivityForResult

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

   startActivityForResult(fullImageActivity, 2);

检查是否在 Activity B 的特定位置删除。这里我重写了onBackPressed() (For Ex.) 方法

public void onBackPressed(){

   super.onBackPressed()

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

onActivityResultActivity A处理它。

 @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data)  
       {  
                 super.onActivityResult(requestCode, resultCode, data);  
                  // check if the request code is same as what is passed  here it is 2  
                   if(requestCode==2)  
                         {  
                            if(data.getBooleanExtra("isdeleted")){   
                           remove from position array and notify dataset change. // pos = data.getIntExtra("pos") 
                            }
                         }  
     } 

对不起,错字了。

【讨论】:

  • 我已经试过了。但问题是,用户可以向左/向右滑动图像以在活动 B 中查看更多图像。因此,他们可以在返回活动 A 之前删除多个图像。这就是我试图删除活动 B 中的位置的原因本身。
  • 所以通过arraylist或通过逗号分隔的位置,并在activityresult上从用逗号分隔的字符串创建数组。
  • 即使用户点击操作栏中的后退按钮,它会起作用吗?
  • 为此你必须调用你的图标点击事件。基本上是主页点击
  • 不知道为什么,onActivityResult 后按时没有触发。它正在调用 onResume
【解决方案2】:

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

使用单例

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

单例类

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

我的适配器

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

活动 B

在Activity B中使用singleton类展示图片,因为使用的是模型数组列表,所以可以轻松实现左右滑动,删除多张图片。

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

【讨论】:

    【解决方案3】:

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

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

    现在您可以像这样从活动 B 中调用它:

    ActivityA.remove(position);
    

    我认为这会奏效。

    【讨论】:

    • 不工作,“不能从静态上下文引用非静态方法”
    • 但在上面,我建议您将方法设为静态:'public static void remove(int position)'请发送您的完整代码。也许我可以帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多