Android ListView Пользовательский адаптер ImageButton - PullRequest
6 голосов
/ 25 мая 2011

Это может быть неправильный подход, если есть более хороший способ, пожалуйста, скажите мне. Я создал класс Custom Adapter и в своем методе 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 ]

24 голосов
/ 05 декабря 2011

Вы должны установить кнопку изображения как не 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);

Надеюсь, это поможет.

2 голосов
/ 25 мая 2011

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

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

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

1 голос
/ 21 июня 2011

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

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

0 голосов
/ 13 января 2012

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

<?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;  
}  
}  
0 голосов
/ 06 июня 2011

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

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

0 голосов
/ 25 мая 2011

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

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

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

...