Android ListView Custom Adapter ImageButton

蓝咒 提交于 2019-12-23 09:27:05

问题


This may not be the correct approach, if there is a better way pleas tell me. I've created a class of Custom Adapter & in my getView method I inflate the view I want to use

public View getView(int position, View convertView, ViewGroup parent) 
    {
        View v = mInflater.inflate(R.layout.wherelayout, null);
        if (convertView != null) 
        {
            v = convertView;
        }
        HashMap<String, Object> whereHash = (HashMap<String, Object>) this.getItem(position);
        if (whereHash != null) 
        {
            TextView whereId = (TextView) v.findViewById(R.id.tvWhere);
            TextView whereDetails = (TextView) v.findViewById(R.id.tvWhereDetails);
            ImageButton ibDelWhere = (ImageButton) v.findViewById(R.id.ibDelWhere);

            whereId.setText((CharSequence) whereHash.get("where"));
            whereDetails.setText((CharSequence) whereHash.get("details"));
            if (ibDelWhere != null)
            {
                ibDelWhere.setId(position);
                ibDelWhere.setOnClickListener(new OnClickListener() 
                  {

                    @Override
                    public void onClick(View v) 
                    {
                        //do stuff when clicked
                    }
                  }
                );
            }
        }
        return v;
    }

The view consists of 2 TextView aligned to the left & an ImageButton aligned to the right, I want to be able to delete the item from the ListView when the button is clicked. the layout is like this -

    <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="horizontal" android:clickable="true">
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:textSize="25sp" android:id="@+id/tvWhere" android:textColor="#00FF00" android:text="TextView" android:gravity="top|left" android:layout_alignParentTop="true" android:layout_alignParentLeft="true"></TextView>
<TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/tvWhereDetails" android:textColor="#0000FF" android:text="TextView" android:textSize="18sp" android:layout_below="@+id/tvWhere" android:gravity="bottom|left" android:layout_alignParentLeft="true"></TextView>
<ImageButton android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/eraser" android:id="@+id/ibDelWhere" android:layout_alignParentRight="true" android:layout_alignParentTop="true"></ImageButton>
</RelativeLayout>

The problem is that when the ImageButton is in the layout, I can click it & the onClick() fires as expected, but I can't click the actual list item itself, i.e. click on the TextView items to fire the ListView.onItemClick that was assigned to it already. If I remove the ImageButton from the layout, then the ListView.onItemClick event fires when I click the item. Is there any way I can enable clicking both the ListView item & the button within the layout ? Thanks guys & gals.


回答1:


You have to set the imagebutton as non focusable and non focusableInTouchMode (clickable is ok).

Please note, as opposed as other views, you can't do that in xml because the android:focusable gets overwritten in ImageButton's constructor. To be more precise, that's one of the few differences between ImageView and ImageButton. See for yourself, this is the complete source of ImageButton.

@RemoteView
public class ImageButton extends ImageView {
    public ImageButton(Context context) {
        this(context, null);
    }

    public ImageButton(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
    }

    public ImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setFocusable(true);
    }

    @Override
    protected boolean onSetAlpha(int alpha) {
        return false;
    }
}

To solve, just call setFocusable(false) from java. Or use an ImageView :)

myImageButton.setFocusable(false);

Hope it helps.




回答2:


You can make both clickable, but it's not really supported and Romain Guy will yell at you. Also, you won't be able to focus/press the button with the trackball. With that said, you can add the following properties to the button, which should make both clickable:

android:focusable="false"
android:focusableInTouchMode="false"

Just make sure you can live with the consequences.




回答3:


Try to set android:clickable="false" on the relative Layout.

I had the same problem with a LinearLayout inside another Linearlayout. The outer LinearLayout was clickable=true, result: The ListView.OnItemClickListener does not fire. After setting it to clickable=false it works.




回答4:


i.e. click on the TextView items to fire the ListView.onItemClick that was assigned to it already.

What happens when you click on the TextView while the ImageButton is there? Does it register a click on the button? or do nothing at all?

How much space in the row does the ImageButton take up? It could be that it is large enough that you can't click in the row outside of it.




回答5:


I had this same problem. My solution was to set the onClick method for the view inside the adapter instead of using onItemClick.

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

    View v = convertView;
    if(v == null){
        LayoutInflater inflater = context.getLayoutInflater();
        v = inflater.inflate(R.layout.list_item, parent, false);
    }
    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //This should replace the onListItemClick method
        }
    });

    v.findViewById(R.id.someinnerview).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //Write one of these for each of your inner views
        }
    });
    return v;
}

Hope that helps! Depending on the rest of your program, this might force you into handing more data to the adapter (which I had to do) but it works.




回答6:


here is example of the custom adapter in list view.

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout  
    android:id="@+id/relativeLayout1"  
   android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    xmlns:android="http://schemas.android.com/apk/res/android"  
   android:padding="5dip">  

   <ImageView  
      android:layout_width="50dip"  
      android:layout_height="50dip"  
    android:id="@+id/imgViewLogo"  
       android:src="@drawable/icon"  
      android:layout_alignParentLeft="true"  
      android:layout_centerInParent="true"  
      android:scaleType="center">  
  </ImageView>  

 <TextView  
      android:textAppearance="?android:attr/textAppearanceLarge"  
       android:layout_height="wrap_content"  
      android:text="TextView"  
      android:layout_width="wrap_content"  
       android:id="@+id/txtViewTitle"  
      android:layout_toRightOf="@+id/imgViewLogo"  
       android:layout_marginLeft="2dip">  
   </TextView>  

  <TextView  
      android:layout_height="wrap_content"  
      android:text="TextView"  
       android:layout_width="wrap_content"  
       android:id="@+id/txtViewDescription"  
       android:layout_toRightOf="@+id/imgViewLogo"  
       android:layout_below="@+id/txtViewTitle"  
       android:layout_marginLeft="2dip">  
  </TextView>   

       <TextView  
      android:layout_height="wrap_content"  
      android:text="TextView"  
       android:layout_width="wrap_content"  
       android:id="@+id/txtViewMobile"  
       android:layout_toRightOf="@+id/imgViewLogo"  
       android:layout_below="@+id/txtViewDescription"  
       android:layout_marginLeft="2dip">  
  </TextView>    

and make java file On The BaseAdapter

public class ListViewCustomAdapter extends BaseAdapter {
Context context;  
String[] mobile;
String[] month;
 String[] number;
 public LayoutInflater inflater; 


public ListViewCustomAdapter(Context context,String[] month, String[] number, String[] mobile) {
    // TODO Auto-generated constructor stub
     super();  
     this.context = context;  
    this.month=month;
    this.number=number;
    this.mobile=mobile;
    Log.i("88888888888888888","*******333********");
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
}

 //ADC71C 95AA1F

public int getCount() {  
    // TODO Auto-generated method stub  
    return month.length;  

}  

public Object getItem(int position) {  
    // TODO Auto-generated method stub  
    return position;  
}  

public long getItemId(int position) {  
    // TODO Auto-generated method stub  
    return 0;  
}  

private class ViewHolder {  
    TextView txtViewTitle;  
    ImageView imgViewLogo;  
    TextView txtViewDescription;
    TextView txtViewMobile;

}  

public View getView(int position, View convertView, ViewGroup parent)  
{  
    // TODO Auto-generated method stub 
     Log.i("88888888888888888","*******444********");

    ViewHolder holder;  
    LayoutInflater inflater =  ((Activity) context).getLayoutInflater();  

    if (convertView == null)  
    {  
         Log.i("88888888888888888","*******555********");
        convertView = inflater.inflate(R.layout.listitem_row, null);  
        holder = new ViewHolder();  
        holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);  
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitle);  
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescription);  
        holder.txtViewMobile = (TextView) convertView.findViewById(R.id.txtViewMobile);
        convertView.setTag(holder);  
    }  
    else  
    {  
         Log.i("88888888888888888","*******666********");
        holder = (ViewHolder) convertView.getTag();  
    }  
    Log.i("888888888888","Display the value of the textbox like(9856321584)other wise (TextView)");
    holder.txtViewTitle.setText(month[position]);  
    holder.txtViewDescription.setText(number[position]); 
    holder.txtViewMobile.setText(mobile[position]);

return convertView;  
}  
}  


来源:https://stackoverflow.com/questions/6116583/android-listview-custom-adapter-imagebutton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!