Java 如何将随机位置发送到下一个活动

Java 如何将随机位置发送到下一个活动,java,android,Java,Android,在第一个活动中,我使用毕加索的字符串数组URL在gridview中显示随机图像,当我在gridview中单击任何图像时,我希望在下一个活动中显示精确的随机图像。我使用put extra并发送该位置,如intr=random.nextInt(array.length)我在gridview中使用了r,并将额外的放置为位置。但是,当我在imageview中设置该r时,它显示的是另一个随机图像,这并不准确 这是我的代码 public class MainActivity extends Activity

在第一个活动中,我使用毕加索的字符串数组URL在gridview中显示随机图像,当我在gridview中单击任何图像时,我希望在下一个活动中显示精确的随机图像。我使用put extra并发送该位置,如int
r=random.nextInt(array.length)我在gridview中使用了r,并将额外的放置为位置。但是,当我在imageview中设置该r时,它显示的是另一个随机图像,这并不准确

这是我的代码

public class MainActivity extends Activity {

   static Random random;
    private GridView photoGrid;
    private int mPhotoSize, mPhotoSpacing;
static int p;
    // Some items to add to the GRID


static final String[] icons= {
                "https://abhiandroid.com/ui/wp-content/uploads/2015/12/horizontalSpacing-in-Gridview.jpg",
                "http://www.whatsappstatusmessages.com/wp-content/uploads/2017/01/whatsapp-dp-images-in-english.jpg",
                "http://www.sarkarinaukrisearch.in/wp-content/uploads/2019/02/whatsapp-dp-status-in-english-1-77.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://4.bp.blogspot.com/-2iawNx83Kpw/XL21pPj0aPI/AAAAAAAAKiE/VRR7pupbWDUj0TNNAKdGH8Baaz_c9IcSgCLcBGAs/s1600/ss.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://3.bp.blogspot.com/-8us6YRiZEh0/XL21c6ibbXI/AAAAAAAAKh4/eNyjErq7q04YCeWxDPWojYfOoAC8BCodwCLcBGAs/s1600/s.jpg"

        };


GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gridView = findViewById(R.id.albumGrid);

    CustomAdopter customAdopter=new CustomAdopter();

gridView.setAdapter(customAdopter);
    gridView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent(MainActivity.this, SwipeView.class);
            intent.putExtra("id", p);
            startActivity(intent);
        }
    });


}

private static class CustomAdopter extends BaseAdapter {

     static int p;

    @Override
    public int getCount() {
        return icons.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        View view = getLayoutInflater().inflate(R.layout.phototem, null);
        ImageView imageView = view.findViewById(R.id.cover);
        random = new Random(); // or create a static random field...
        p=  random.nextInt(icons.length);


        Picasso.get().load(icons[p]).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

        return view;
    }

}

}

为此,您应该创建一个
接口
,并通过该接口传递随机位置。 变量
p
不是单击的项目位置。
p
的值在
gridView
填充项目时不断变化。 编辑: 创建一个
界面
,如下所示:

public interface ItemClickListener {
    void onItemClick(int position);
}
现在,使用公共setter在
customadapter
类中初始化
itemclicklinklistener
实例

public void setItemClickListener(ItemClickListener clickListener) {
    onItemClickListener = clickListener;
}
最后,在
getview
方法中添加以下代码,将适配器位置传递给侦听器

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        onItemClickListener.onItemClick(p);
    }
});
现在,不要使用
GridView
OnItemClickListener()
,而是使用此接口获取正确的位置。像这样-

gridView.setAdapter(customAdopter);
customAdopter.setItemClickListener(new ItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Intent intent = new Intent(MainActivity.this, SwipeView.class);
            intent.putExtra("id", position);
            startActivity(intent);
        }
    });

我打算为您提供一个解决此问题的替代方案,即使用带有gridLayoutManager的recyclerview,并创建一个实现recyclerview.Adapter的自定义布局……我想所有这些可能会让您感到困惑,因此我快速创建一个单元测试来模拟您的代码想要实现的功能,下面是结果

public class ExampleUnitTest {
    private static String data = null;

    @Test
    public void setParentData(){
        data = "I set You";

        Subclass subclass = new Subclass();
        subclass.getParentData();
    }

    private static class Subclass{
        void getParentData(){
            assertEquals("I set You", data);
        }
    }
}
//Tests passed
我将花一分钟来解释这一点,因为您将自定义适配器作为MainActivity的子类,那么我认为该子类应该可以访问其父类的一些值。 我说的是:
static int p
所以您不需要像在CustomAdapter类的子类中一样创建其中的两个。 下面是对你的代码的修改,我相信只要测试通过就可以了,否则,请让我知道,这样我可以再看一看。 这并不是一个真正的答案,但这是我分享代码和详细解释某些事情的唯一方式

public class MainActivity extends Activity {

   static Random random;
    private GridView photoGrid;
    private int mPhotoSize, mPhotoSpacing;
   static int p;
    // Some items to add to the GRID


static final String[] icons= {
                "https://abhiandroid.com/ui/wp-content/uploads/2015/12/horizontalSpacing-in-Gridview.jpg",
                "http://www.whatsappstatusmessages.com/wp-content/uploads/2017/01/whatsapp-dp-images-in-english.jpg",
                "http://www.sarkarinaukrisearch.in/wp-content/uploads/2019/02/whatsapp-dp-status-in-english-1-77.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://4.bp.blogspot.com/-2iawNx83Kpw/XL21pPj0aPI/AAAAAAAAKiE/VRR7pupbWDUj0TNNAKdGH8Baaz_c9IcSgCLcBGAs/s1600/ss.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://3.bp.blogspot.com/-8us6YRiZEh0/XL21c6ibbXI/AAAAAAAAKh4/eNyjErq7q04YCeWxDPWojYfOoAC8BCodwCLcBGAs/s1600/s.jpg"

        };


GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gridView = findViewById(R.id.albumGrid);

    random = new Random(); // or create a static random field...
    p=  random.nextInt(icons.length);

    CustomAdopter customAdopter=new CustomAdopter();

gridView.setAdapter(customAdopter);
    gridView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent(MainActivity.this, SwipeView.class);
            intent.putExtra("id", p);
            startActivity(intent);
        }
    });


}

private static class CustomAdopter extends BaseAdapter {

    @Override
    public int getCount() {
        return icons.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        View view = getLayoutInflater().inflate(R.layout.phototem, null);
        ImageView imageView = view.findViewById(R.id.cover);

Picasso.get().load(icons[p]).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

        return view;
    }

}
公共类MainActivity扩展活动{
静态随机;
私有网格视图光网格;
私人国际摄影展,摄影展;
静态int-p;
//要添加到网格中的某些项目
静态最终字符串[]图标={
"https://abhiandroid.com/ui/wp-content/uploads/2015/12/horizontalSpacing-in-Gridview.jpg",
"http://www.whatsappstatusmessages.com/wp-content/uploads/2017/01/whatsapp-dp-images-in-english.jpg",
"http://www.sarkarinaukrisearch.in/wp-content/uploads/2019/02/whatsapp-dp-status-in-english-1-77.jpg",
"https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
"https://4.bp.blogspot.com/-2iawNx83Kpw/XL21pPj0aPI/AAAAAAAAKiE/VRR7pupbWDUj0TNNAKdGH8Baaz_c9IcSgCLcBGAs/s1600/ss.jpg",
"https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
"https://3.bp.blogspot.com/-8us6YRiZEh0/XL21c6ibbXI/AAAAAAAAKh4/eNyjErq7q04YCeWxDPWojYfOoAC8BCodwCLcBGAs/s1600/s.jpg"
};
GridView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView=findViewById(R.id.albumGrid);
random=新建random();//或创建一个静态随机场。。。
p=随机.nextInt(图标.长度);
CustomAdapter CustomAdapter=新CustomAdapter();
setAdapter(CustomAdapter);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
意向意向=新意向(MainActivity.this、SwipeView.class);
意图。额外(“id”,p);
星触觉(意向);
}
});
}
私有静态类CustomAdapter扩展BaseAdapter{
@凌驾
public int getCount(){
返回图标长度;
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=GetLayoutFlater()。充气(R.layout.phototem,null);
ImageView ImageView=view.findViewById(R.id.cover);
Picasso.get().load(icons[p]).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
返回视图;
}
}

为什么p
是静态的
?除此之外,你不应该在非静态方法中初始化静态字段。实现这一点的一个快速方法是将执行随机操作的代码移动到MainActivity,可能在icons数组下面。现在我将random放入oncreate,而不是custom Adapter和out image和inner image相同,但外部图像都相同我有7个不同的URL,但当我单击n任何图像时显示的图像都相同在下一个活动中显示的图像都相同,但问题是外部所有图像都是samei尝试过的@Whates,但其给出的错误,你能给我发送代码吗?我不知道如何为此创建界面
public class MainActivity extends Activity {

   static Random random;
    private GridView photoGrid;
    private int mPhotoSize, mPhotoSpacing;
   static int p;
    // Some items to add to the GRID


static final String[] icons= {
                "https://abhiandroid.com/ui/wp-content/uploads/2015/12/horizontalSpacing-in-Gridview.jpg",
                "http://www.whatsappstatusmessages.com/wp-content/uploads/2017/01/whatsapp-dp-images-in-english.jpg",
                "http://www.sarkarinaukrisearch.in/wp-content/uploads/2019/02/whatsapp-dp-status-in-english-1-77.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://4.bp.blogspot.com/-2iawNx83Kpw/XL21pPj0aPI/AAAAAAAAKiE/VRR7pupbWDUj0TNNAKdGH8Baaz_c9IcSgCLcBGAs/s1600/ss.jpg",
                "https://www.trueshayari.in/wp-content/uploads/2018/07/Love-Status-DP-for-Couple.jpg",
                "https://3.bp.blogspot.com/-8us6YRiZEh0/XL21c6ibbXI/AAAAAAAAKh4/eNyjErq7q04YCeWxDPWojYfOoAC8BCodwCLcBGAs/s1600/s.jpg"

        };


GridView gridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gridView = findViewById(R.id.albumGrid);

    random = new Random(); // or create a static random field...
    p=  random.nextInt(icons.length);

    CustomAdopter customAdopter=new CustomAdopter();

gridView.setAdapter(customAdopter);
    gridView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent(MainActivity.this, SwipeView.class);
            intent.putExtra("id", p);
            startActivity(intent);
        }
    });


}

private static class CustomAdopter extends BaseAdapter {

    @Override
    public int getCount() {
        return icons.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        View view = getLayoutInflater().inflate(R.layout.phototem, null);
        ImageView imageView = view.findViewById(R.id.cover);

Picasso.get().load(icons[p]).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

        return view;
    }

}