How to get position imageView in ListView Android - java

I have a list with pictures for each item, when I click on an image I need the position of the list.
how can I get this?
I tried to do View.getTag().ToString() but by mistake.
Here's the code:
ImageView im = (ImageView) convertView.findViewById(R.id.imageViewDSD);
im.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
try {
Toast.makeText(contextCustom,
"ImageView clicked for the row = " + v.getTag(),
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.i("Error", "errore vista " + e);
}
}
});

listView.setOnItemClickListener(new OnItemClickListener()
{
#Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
{
postion on your image
Toast.makeText(getApplicationContext(), ""+position, Toast.LENGTH_LONG).show();
}
});

On each getView, set the ImageView's tag to be equal to the list item's position.
Then in your listener you can get the tag, and determine which list item this image belongs to.
ImageView im = (ImageView) convertView.findViewById(R.id.imageViewDSD);
im.setTag(position);
Also note that you shouldn't create a new listener every time getView is called, instead do it only when convertView is null. However the tag should always be set regardless of convertView's value.
Edit:
Here's a full example of neat getView method (using a holder pattern to avoid findViewById):
private static class ViewHolder {
ImageView imgView;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
// (Re)Use the convertView
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.imgView = (ImageView) convertView.findViewById(R.id.imageViewDSD);
holder.imgView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Toast.makeText(contextCustom, "Pos: " + v.getTag(),
Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.imgView.setTag(position);
// Do something else with your image here
return convertView;
}

Related

Get Value in method from getView of BaseAdapter

This is my Custom Adapter. I have three ImageViews here. I wanted to give onclick for every imageview.
First I have called a method when click on ImageView. In that method I need to replace with the another image. And also need to replace remaining two Imageview images also.
Now When I click on first imageview, method is calling and image also changing for that. But for Remaining two Imageviews, It is showing NULL POINTER EXCEPTION.
How to access those ImageViews in that method.
Any help would be appreciated.
public class CustomTestingProductsListAdapter extends BaseAdapter{
public CustomTestingProductsListAdapter(Context context, Activity activity, List<V_APP_PACK_QR_DET_INFO> pack_qr_det_infos) {
layoutInFlater = LayoutInflater.from(context);
this.pack_qr_det_infos = pack_qr_det_infos;
this.curActivity = activity;
this.mContext = (VilanApplication) VilanApplication.mContext;
}
#Override
public int getCount() {
return pack_qr_det_infos.size();
}
#Override
public Object getItem(int position) {
return pack_qr_det_infos.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
try{
CustomTestingProductsListAdapter.ViewHolder holder;
if(convertView == null){
holder = new CustomTestingProductsListAdapter.ViewHolder();
convertView = layoutInFlater.inflate(R.layout.tst_ver_prdouct_list_items,null);
holder.tvProduct = convertView.findViewById(R.id.tv_qc_productName);
holder.DLSno = convertView.findViewById(R.id.tvtst_DLSno);
holder.iv_tst_received = convertView.findViewById(R.id.iv_tst_received);
holder.iv_tst_not_received = convertView.findViewById(R.id.iv_tst_not_received);
holder.iv_tst_wrong_product = convertView.findViewById(R.id.iv_tst_wrong_product);
convertView.setTag(holder);
}else{
holder = (CustomTestingProductsListAdapter.ViewHolder) convertView.getTag();
}
holder.DLSno.setText(pack_qr_det_infos.get(position).PRODUCTSLNO);
holder.iv_tst_received.setOnClickListener(onClickListener(position));
}catch (Exception e){
Log.d(VilanConstants.TAG,"/Excp #listAdp"+ e.toString());
}
return convertView;
}
private View.OnClickListener onClickListener(final int position){
return new View.OnClickListener() {
#Override
public void onClick(View v) {
try {
CustomTestingProductsListAdapter.ViewHolder holder;
holder = new CustomTestingProductsListAdapter.ViewHolder();
holder.iv_tst_received = v.findViewById(R.id.iv_tst_received);
holder.iv_tst_not_received = v.findViewById(R.id.iv_tst_not_received);
holder.iv_tst_wrong_product = v.findViewById(R.id.iv_tst_wrong_product);
Toast.makeText(mContext, "Item Received" , Toast.LENGTH_SHORT).show();
holder.iv_tst_received.setImageResource(R.drawable.ic_received_green);
holder.iv_tst_not_received.setImageResource(R.drawable.ic_not_received);
holder.iv_tst_wrong_product.setImageResource(R.drawable.ic_wrong_product);
Status = 0 ;
}catch (Exception e){
Log.e(VilanConstants.TAG,"/Excp due to"+e.toString());
}
}
};
}
public class ViewHolder{
private TextView tvProduct;
private TextView DLSno;
private ImageView iv_tst_received;
private ImageView iv_tst_not_received;
private ImageView iv_tst_wrong_product;
}
}
Update Your getView():
#Override
public View getView(int position, View convertView, ViewGroup parent) {
try{
CustomTestingProductsListAdapter.ViewHolder holder;
if(convertView == null){
holder = new CustomTestingProductsListAdapter.ViewHolder();
convertView = layoutInFlater.inflate(R.layout.tst_ver_prdouct_list_items,null);
holder.tvProduct = convertView.findViewById(R.id.tv_qc_productName);
holder.DLSno = convertView.findViewById(R.id.tvtst_DLSno);
holder.iv_tst_received = convertView.findViewById(R.id.iv_tst_received);
holder.iv_tst_not_received = convertView.findViewById(R.id.iv_tst_not_received);
holder.iv_tst_wrong_product = convertView.findViewById(R.id.iv_tst_wrong_product);
convertView.setTag(holder);
}else{
holder = (CustomTestingProductsListAdapter.ViewHolder) convertView.getTag();
}
holder.DLSno.setText(pack_qr_det_infos.get(position).PRODUCTSLNO);
holder.iv_tst_received.setOnClickListener(new View.OnClickListener(){
#Override
public void onClick(View v) {
Toast.makeText(mContext, "Item Received" , Toast.LENGTH_SHORT).show();
holder.iv_tst_received.setImageResource(R.drawable.ic_received_green);
holder.iv_tst_not_received.setImageResource(R.drawable.ic_not_received);
holder.iv_tst_wrong_product.setImageResource(R.drawable.ic_wrong_product);
Status = 0 ;
}
});
}catch (Exception e){
Log.d(VilanConstants.TAG,"/Excp #listAdp"+ e.toString());
}
return convertView;
}

OnCLickListener for one Item in ListView Row

I've got a ListView filled with multiple items per row. How do i set an OnCLickListener in getView() of the custon ArrayAdapter class for just one Item, not the whole row of the ListView?
#NonNull
#Override
public View getView(final int position, #Nullable final View convertView, #NonNull final ViewGroup parent) {
currentLayout = getItem(position);
myViewHolder= null;
view = convertView;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.rowlayout, parent, false);
myViewHolder= new ViewHolder(view);
view.setTag(myViewHolder);
}
myViewHolder= (ViewHolder) view.getTag();
myViewHolder.content.setText(currentLayout.getContent());
myViewHolder.number.setText("1");
return view;
}
Thank you for the answers.
To clarify first, view which you inflate is the row layout. In order to set the on click listener on a child item, simply find that item by id and then set the listener:
//It can be any type of view that supports on click listener
//Using TextView as an example
//Don't forget to assign an id to the child in xml
TextView childView = (TextView) view.findViewById(R.id.enter_child_id);
childView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
//Do something
}
});
To have a different listener for different rows, it is better to set the listener in the onBindViewHolder not getView. getView is simply used just to inflate the view and therefore will make all your listeners on all rows non-distinguishable. In that case you can extract view or child views directly from the viewholder
#Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
TextView childView = holder.childView;
childView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
//Do something
}
});
}
#NonNull
#Override
public View getView(final int position, #Nullable final View convertView, #NonNull final ViewGroup parent) {
currentLayout = getItem(position);
myViewHolder= null;
view = convertView;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.rowlayout, parent, false);
myViewHolder= new ViewHolder(view);
view.setTag(myViewHolder);
}
myViewHolder= (ViewHolder) view.getTag();
myViewHolder.content.setText(currentLayout.getContent());
myViewHolder.number.setText("1");
yourview.setonclickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
do your stuff here
}
});
return view;
}
The problem was, that I was using a LsitView instead of a RecyclerView. After fixing that issue and calling the onCLick in onBindViewHolder, everything went fine.

Android Gridview Smooth scrolling with button

I am currently making a part of my app to select multiple images from gallery using Gridview. The PROBLEM is that I need to put a button on the first item and the rest will be images (the 0,0 will be button and the rest well, imageview with check box) That button will be using the phone camera. I was able to make it, but in exchange, it is not scrolling smoothly, is there a way to fix this? below is my code:
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View view;
System.out.println(position);
if (position == 0) {
holder = new ViewHolder();
view = getLayoutInflater().inflate(R.layout.year_dropdownlayout, parent, false);
holder.mButton = (Button) view.findViewById(R.id.mfreakingBtn);
ViewGroup.LayoutParams params = holder.mButton.getLayoutParams();
params.height = 250;
params.width = 250;
holder.mButton.requestLayout();
} else {
view = getLayoutInflater().inflate(R.layout.select_photos_layout, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) view.findViewById(R.id.imageView1);
holder.mCheckBox = (CheckBox) view.findViewById(R.id.checkBox1);
holder.mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
holder.progressBar = (ProgressBar) view.findViewById(R.id.progress);
holder.mButton = null;
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "You Clicked " + position, Toast.LENGTH_LONG).show();
}
});
imageLoader.displayImage("file://" + imageUrls.get(position), holder.imageView, options, new SimpleImageLoadingListener() {
#Override
public void onLoadingStarted(String imageUri, View view) {
holder.progressBar.setProgress(0);
holder.progressBar.setVisibility(View.VISIBLE);
}
#Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
holder.progressBar.setVisibility(View.GONE);
}
#Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
Animation anim = AnimationUtils.loadAnimation(MultiPhotoSelect.this, R.anim.fade_in);
holder.imageView.setAnimation(anim);
anim.start();
holder.progressBar.setVisibility(View.GONE);
}
}, new ImageLoadingProgressListener() {
#Override
public void onProgressUpdate(String imageUri, View view, int current,
int total) {
holder.progressBar.setProgress(Math.round(100.0f * current / total));
}
}
);
holder.mCheckBox.setTag(position);
holder.mCheckBox.setChecked(mSparseBooleanArray.get(position));
}
return view;
}
Don't mind the names of the layouts. :) This what happens when frustration gets to ya. I have been looking for hours now. I found one who put a button on the end of the gridview this: Android - Different items in GridView not showing up
I hope someone can help me. Thanks in advance. :)
Your adapter...
private static final int ItemTypeButton = 0;
private static final int ItemTypeImage = 1;
#override
public int getViewTypeCount()
{
return 2; // 2 because you want two type of view. (One button and the rest is images)
}
#override
public int getItemViewType(int position)
{
/* it's better to use item view type
to determine what type of view
you want to display. This is used
for recycling views for optimization. */
return position == 0 ? ItemTypeButton : ItemTypeImage;
}
public View getView(final int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
/* Check whether convertView intance is null. If null, then inflate.
Otherwise the view is recycled for optimization. */
if (convertView == null)
{
if (type == ItemTypeButton)
{
// inflate button view
}
else if (type == ItemTypeImage)
{
// inflate your view for image
}
}
// This is where you should update your view states.
if (type == ItemTypeImage)
{
/* ... */
holder.imageView = (ImageView) view.findViewById(R.id.imageView1);
holder.imageView.setImage(.....
}
else
{
/* ... */
}
}

GridView setOnItemClickListener effects multiple items

When I click the GridView item multiple checks appear where I just want it to appear in the one. I'm pretty sure this has something to do with the recycled views, but I am not sure how to prevent it from happening. Any advice is appreciated.
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
ImageView check = (ImageView) view.findViewById(R.id.check);
if (check.getVisibility() == View.GONE) {
check.setVisibility(View.VISIBLE);
I
}
else {
check.setVisibility(View.GONE);
}
}
});
Here is the adapter
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_item, null);
} else {
grid = (View) convertView;
}
ImageView imageView = (ImageView) grid.findViewById(R.id.grid_image);
final ProgressBar pb = (ProgressBar) grid.findViewById(R.id.progressbar);
final ImageView check = (ImageView) grid.findViewById(R.id.check);
Ion.with(mContext).load(objects.get(position).getThumnailURL())
.progressBar(pb).withBitmap()
.error(R.drawable.ic_launcher).intoImageView(imageView).setCallback(new FutureCallback<ImageView>() {
#Override
public void onCompleted(Exception e, ImageView file) {
pb.setVisibility(View.GONE);
}
});
return grid;
}
You can do it like this:
put a boolean variable in your object that is passed to your adapter(ArrayList) and control the visibility of check boxes by this variable so if onitemclick is called toggle that variable and call notifydatasetchange. In the getView set each check boxes by the value of this variable. in this way if you scroll the gridview your value of your check boxes do not get lost.
#Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder _holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_item, null);
_holder.imageView = (ImageView) grid.findViewById(R.id.grid_image);
_holder.pb = (ProgressBar) grid.findViewById(R.id.progressbar);
_holder.check = (ImageView) grid.findViewById(R.id.check);
convertView.setTag(_holder);
}
else {
_holder = (ViewHolder) convertView.getTag();
}
//here set your values
Ion.with(mContext).load(objects.get(position).getThumnailURL())
.progressBar(pb).withBitmap()
.error(R.drawable.ic_launcher).intoImageView(imageView).setCallback(new FutureCallback<ImageView>() {
#Override
public void onCompleted(Exception e, ImageView file) {
pb.setVisibility(View.GONE);
}
});
return grid;
}
class ViewHolder {
ImageView imageView,check;
ProgressBar pb;
}
Try this !!

Set onClickListener into custom adapter

Hello at all the community,
i've this adapter with 2 button and 2 textview.
#Override
public View getView(int position, View view, ViewGroup parent) {
if(view == null) {
holder = new Holder();
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_adapter, null);
holder.result = (TextView)view.findViewById(R.id.description);
holder.value = (TextView)view.findViewById(R.id.value);
holder.add = (Button)view.findViewById(R.id.add);
holder.subtract = (Button)view.findViewById(R.id.subtract);
myObject = getItem(position);
holder.result.setText(myObject.result);
holder.value.setText(myObject.value);
view.setTag(holder);
} else {
holder = (Holder)view.getTag();
}
holder.add.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
// TODO Auto-generated method stub
}
});
return view;
}
Now my question is: if I want that when the user press on add button set the text of the textview with (for example) 5 how can i do this? If I put into the onCLick method
holder.result.setText("My text") set the text of the last textview and not the correspond textview of the selected row item (I disabled the click on the listview with):
#Override
public boolean isEnabled(int position) {
return false;
}
Is there any solution for my problem?
You should put your code in the getView method inside the adapter and remember to use references to the current Button/TextVeiw so that each Button would correspond to that specific TextView
P.S. I found something with your code check this out:
#Override
public View getView(int position, View view, ViewGroup parent) {
if(view == null) {
holder = new Holder();
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_adapter, null);
holder.result = (TextView)view.findViewById(R.id.description);
holder.value = (TextView)view.findViewById(R.id.value);
holder.add = (Button)view.findViewById(R.id.add);
holder.subtract = (Button)view.findViewById(R.id.subtract);
view.setTag(holder);
} else {
holder = (Holder)view.getTag();
}
myObject = getItem(position);
holder.result.setText(myObject.result);
holder.value.setText(myObject.value);
final TextView tv = holder.result;
holder.add.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
tv.setText("bla bla");
}
});
return view;
}
You mixed something up, the getItem has to be below the view creation stuff. First create the view, then set the values.
#Override
public View getView(int position, View view, ViewGroup parent) {
if(view == null) {
holder = new Holder();
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_adapter, null);
holder.result = (TextView)view.findViewById(R.id.description);
holder.value = (TextView)view.findViewById(R.id.value);
holder.add = (Button)view.findViewById(R.id.add);
holder.subtract = (Button)view.findViewById(R.id.subtract);
view.setTag(holder);
} else {
holder = (Holder)view.getTag();
}
myObject = getItem(position);
holder.result.setText(myObject.result);
holder.value.setText(myObject.value);
holder.add.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View view) {
//What should happen here?
}
});
return view;
}

Categories

Resources