I am developing an app which has 9 image views in a 3x3 matrix.
I want to change their image if a user clicks them.
So tat requires linking 9 ids and 9 set on click listeners
Is it possible to access them using a for loop like this
public int[] imv= {R.id.im0, R.id.im1, R.id.im2, R.id.im3,R.id.im4, R.id.im5, R.id.im6, R.id.im7,R.id.im8};//Loading ids into array imv
for(int i=0;i<imv.length;i++)
{
ImageView im[i] = (ImageView) findViewById(imv[i]);//Attaching ids
}
for(int i=0;i<imv.length;i++)
{
im[i].setOnClickListener
}
I am getting an error with im[i]. But if I remove i I get an object im which is a collection of imageviews. How can I access the individual imageviews and set onclicklisteners?
I think it will be better to go for GridView refer to this example
http://developer.android.com/resources/tutorials/views/hello-gridview.html
you can write your logic in getView method using imageView.setOnClickListener
//scope of the im[i] will end in the first for loop
for(int i=0;i<imv.length;i++)
{
ImageView im[i] = (ImageView) findViewById(imv[i]);//Attaching ids
im[i].setOnClickListener(this);
}
I think the problem is that "im" is declared inside the for loop (making it local to the for loop only).. Declare "im" outside the loop, then just define it inside.
try:
ImageView im[] = new ImageView im[imv.length];
for(int i=0;i<imv.length;i++)
{
im[i] = (ImageView) findViewById(imv[i]);//Attaching ids
}
Note: I've forgotten how to properly declare an array. Just confirm it elsewhere.. :D
Related
I have a layout for recyclerview adapter that it's like a instagram. That means it has a slider for images and like button and etc.
Now I want to load multiple images in the slider and clients should change images with dragging like instagram exactly.
First I used PosterSlider library, but its problem is that doesn't have scale type so I cannot manage images size.
So now I wanna try ViewFLipper, but my problem is I don't know how can I use ViewFlipper like a slider.
That means how can I change images by dragging in ViewFLipper?
If you have another idea for changing picture, I will be glad to hear it.
This is my code for ViewFlipper that I know it is wrong, because it shows just one Image and it doesn't have any code for changing picture by dragging:
try {
JSONArray jsonArray = new JSONArray(newsLetterList.get(position).Jsonsrc);
for(int i = 0;i < jsonArray.length(); i++){
setImageInFlipper(jsonArray.getString(i),holder);
}
} catch (JSONException e) {
e.printStackTrace();
}
setImageInFLipper method:
private void setImageInFlipper(String imgUrl,NewsLetterViewHolder holder){
ImageView imageView = new ImageView(context);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
Glide.with(context).load(imgUrl).into(imageView);
holder.slider.addView(imageView);
}
You can take some reference from here. They have implemented the same viewflipper slide both with next(flip) button and without using any button. Hope that helps!
I have the following scenario:
In a layout, I have imageviews aligned horizontally and vertically as shown in image.
First, which layout should be used for this purpose? RelativeLayout or FrameLayout? ListView inside the layout?
Also, instead of writing setOnClickListener for every imageview, how can I write just one click listener to get the clicked imageview?
A GridView is perfect for this. For more information on GridView, look here.
As for your onClickListener question: there is no easy way to do this, but what you can do is something like this:
Have an array containing every ImageView id like so:
public static final int[] IMAGE_VIEWS = {R.id.imageView1, R.id.imageView2, R.id.imageView3 /*etc*/}; //Make sure to list from the first imageview to the last image view in correct order
Define an onClickListener
private View.OnClickListener imageViewListener = new View.OnClickListener() {
#Override
public void onClick(View v) {
for (int i = 0; i < IMAGE_VIEWS.length; i++) {
if (v.getId() == IMAGE_VIEWS[i]) {
doSomethingWithImageViewClick(i); //if ImageView 4 was clicked, variable 'i' will be 3 (because arrays start at index = 0).
}
}
}
}
Set the onClickListeners for all your imageViews:
final ImageView view1 = (ImageView) view.findViewById(R.id.imageView1);
view1.setOnClickListener(imageViewListener);
//etc
Use 'GridView' in the layout and use 'setOnItemClickListener' to handle click events,
You can find more details in below link
GridView.
GridView can achieve the effect. I think you can look at this Grid View.
I am using custom adapter for listview where I put 4 sections.
Now i have photo section in which I put HorizontalScrollView. I got bunch of images from server so put them in string array.
if (postDisplay.getImageUrl().equals("null")) {
holder.photo_layout.setVisibility(View.GONE);
} else {
holder.photo_layout.setVisibility(View.VISIBLE);
String SharePhotos=postDisplay.getImageUrl();
String temp=SharePhotos.replace("small", "big");
String[] SharePicArray=temp.split("~");
for (int i=0; i<SharePicArray.length; i++) {
ImageView imageview = new ImageView(activity);
imageview.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
imageLoader.DisplayImage(SharePicArray[i], imageview);
String URL=SharePicArray[i];
holder.image_layout.addView(imageview);
}
}
When I run this code first time it gives me right solution but when I scroll down and then scroll up to see again the images it again create another imageview.
If there is any other solution please let me know.
If there is any other view I can take to show images from server.
I am overlapping couple of view's dynamically in my app over a bitmap. I would like to delete those view's before saving the bitmap to gallery. Below in the function which adds view's on my bitmap
public void add()
{
relLayout.addView(newRect);
relLayout.addView(newSpeech);
relLayout.addView(editImgv);
relLayout.addView(resizeImgv);
}
There is a button on pressing it the above add() function gets called and all those views get added over my bitmap again.
Before saving the bitmap I would like to delete all editImgv and resizeImgv which were added
over my bitmap.
Any ideas on how to do it?
Thanks in advance :)
I have resolved it by using Vector arrays - I placed all the 'resizeImgv' and 'editImgv' image views which I am adding dynamically in a vector array of type 'ImageView' and when I am about to save I am just setting their visibility to 'GONE' one by one. It was a simple solution in the end :)
//Global
Vector<ImageView> imgv = new Vector<ImageView>();
....
//Adding views to my vector array
public void setImageViewArray(ImageView imgview){
imgv.add(imgview);
}
.....
//when I am about to save
for(int i = 0; i < imgv.size(); i++ ){
if(imgv.get(i).getVisibility() == View.VISIBLE){
imgv.get(i).setVisibility(View.GONE);
}
}
I am working on an app where I have to set up a number of drawables. The number depends on the user input.
I therefore need to use a loop there I set up as many successive images as the user have chosen in one or several rows.
I can not find out how. I know how to put the images in an array and use
(ImageView) findViewById(R.id.img)
to set them up. But I want to create this successive ImageViews in the loop.
try to make a combinatino of LinearLayout and LayoutInflater (to inflate custom views)
LinearLayout layout = (LinearLayout) findViewById(R.id.linear);
for (int i = 0; i < userChoice; i++)
{
LayoutInflater li = LayoutInflater.from(yourContext);
View customView = li.inflate(R.layout.image_holder, this);
// (In case you need to use the image) ImageView yourImage = (ImageView)customView.findViewById(R.id.image_view);
layout.addView(customView);
}
where:
userChoice is the number the user has choose
layout is linear layout inside your main.xml (or the root element itself)
image_holder is an xml with ImageView inside it