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