ListView С Пользовательского Адаптера Андроид ImageButton С

Это может быть неправильный подход, если есть лучший способ, пожалуйста, скажите мне. Я создал класс пользовательского адаптера, и в моем методе getView я раздуваю представление, которое хочу использовать

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

представление состоит из 2 TextView выровненных слева и ImageButton выровненных справа, я хочу иметь возможность удалить элемент из ListView при нажатии кнопки. макет такой -

    <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>

проблема в том, что когда ImageButton находится в макете, Я могу щелкнуть его , и onClick () срабатывает, как ожидалось, но я не могу щелкнуть сам элемент списка, т. е. нажать на элементы TextView, чтобы запустить ListView.onItemClick, который был назначен ему уже. Если я удалю ImageButton из макета, то ListView.onItemClick событие срабатывает, когда я щелкните элемент. Есть ли способ включить щелчок как по элементу ListView , так и по кнопке в макете ? Спасибо, ребята и девочки.

6 ответов


вы должны установить imagebutton как non focusable и focusableInTouchMode (кликабельно ОК).

обратите внимание, в отличие от других представлений, вы не можете сделать это в xml, потому что android:focusable перезаписывается в ImageButton'конструктор С. Если быть более точным, это одно из немногих различий между ImageView и ImageButton. Посмотрите сами, это полное источник 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;
    }
}

, чтобы решить, просто позвоните setFocusable(false) С java. Или используйте ImageView :)

myImageButton.setFocusable(false);

надеюсь, что это помогает.


вы можете сделать оба кликабельных, но это не поддерживается, и Ромен Гай будет кричать на вас. Кроме того, вы не сможете сосредоточиться/нажать кнопку с трекболом. С учетом сказанного, вы можете добавить следующие свойства к кнопке, которая должна сделать оба кликабельных:

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

просто убедитесь, что вы можете жить с последствиями.


попробуйте установить android: clickable= "false" на относительном макете.

У меня была такая же проблема с LinearLayout внутри другого Linearlayout. Внешний LinearLayout был кликабельным=true, результат: элемент управления ListView.OnItemClickListener не стреляет. После установки его в clickable=false он работает.


т. е. нажмите на элементы TextView, чтобы запустить ListView.onItemClick, который был назначен ему уже.

что происходит, когда вы нажимаете на TextView в то время как ImageButton есть? Он регистрирует щелчок по кнопке? или вообще ничего не делать?

сколько места в строке занимает ImageButton? Возможно, он достаточно велик, чтобы вы не могли щелкнуть в строке вне него.


У меня была такая же проблема. Моим решением было установить метод onClick для представления внутри адаптера вместо использования 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;
}

надеюсь, что это поможет! В зависимости от остальной части вашей программы это может заставить вас передать больше данных адаптеру (что мне пришлось сделать), но это работает.


вот пример пользовательского адаптера в списке.

<?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>    

и сделать java-файл на 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;  
}  
}