У меня есть ListView со строкой, в которой есть ImageButton. Я могу щелкнуть определенную строку, и это работает: начинается новая ожидаемая активность. Но если я нажму ImageButton, а это элемент в строке, ничего не произойдет. ImageButton подсвечивается, но распечатка внутри onClick ImageButton не выполняется. Может ли кто-нибудь сказать мне, как я могу это решить? Вот мой код:
SimpleCursorAdapter menuItems2 = new SimpleCursorAdapter(
this, R.layout.todo_row, matrixCursor, columnNames, to);
ToDolv.setAdapter(menuItems2);
ToDolv.setClickable(true);
ToDolv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {
final String article = (String) todoIDArray.get(position);
globalVariable.setArtID(article);
Intent intent1 = new Intent(MainActivity.this, AddToDo.class);
startActivity(intent1);
finish();
ImageButton chkDone = (ImageButton) findViewById(R.id.chkDone);
chkDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
View parentRow = (View) v.getParent();
ListView listView = (ListView) parentRow.getParent();
final int position = listView.getPositionForView(parentRow);
System.out.println("I am in position "+ position);
}
});
}
});
Вот XML для строки, где находится ImageButton:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip"
android:background = "#5a9b3e"
android:alpha = "0.7"
android:descendantFocusability="blocksDescendants"
>
<TextView
android:id="@+id/id"
android:textColor="#5a9b3e"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/heading"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:alpha = "1.0"
android:layout_alignParentTop="true"
android:ellipsize="marquee"
android:singleLine="false"
android:textSize="12sp"
/>
<ImageView
android:id="@+id/icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:padding="2dp"
android:layout_toRightOf="@+id/heading"
android:layout_toEndOf="@+id/heading"
/>
<ImageView
android:id="@+id/lights"
android:layout_width= "20dp"
android:layout_height="20dp"
android:padding="2dp"
android:layout_toRightOf="@+id/icon"
android:layout_toEndOf="@+id/icon"
/>
<ImageButton
android:id="@+id/chkDone"
android:layout_width="20dp"
android:layout_height="20dp"
android:padding="0dp"
android:background="?android:attr/listChoiceBackgroundIndicator"
android:layout_toRightOf="@+id/lights"
android:layout_toEndOf="@+id/lights"
android:src ="@drawable/checkbox"
android:scaleType="fitXY"
android:focusable="false"
android:focusableInTouchMode="false"
/>
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:alpha = "1.0"
android:layout_marginStart="2sp"
android:layout_marginLeft="2sp"
android:layout_marginTop="2sp"
android:textSize="12sp"
android:layout_toRightOf="@+id/chkDone"
android:layout_toEndOf="@+id/chkDone"/>
</RelativeLayout>
Спасибо большое!
ИЗМЕНИТЬ
Следуя предложениям, я создал пользовательский класс адаптера, чтобы показать строку. Поэтому я изменил код следующим образом: Основная активность теперь имеет следующие строки кода:
ListView yourListView = (ListView) findViewById(R.id.list);
SimpleCursorAdapter menuItems2 = new SimpleCursorAdapter(
this, R.layout.todo_row, matrixCursor, columnNames, to);
CustomListViewAdapter customAdapter = new CustomListViewAdapter(this, R.layout.todo_row, menuItems2);
yourListView .setAdapter(customAdapter);
И CustomListViewAdapter выглядит так:
public class CustomListViewAdapter extends ArrayAdapter<RowItem> {
Context context;
public CustomListViewAdapter(Context context, int resourceId,
SimpleCursorAdapter menuItems2) {
super(context, resourceId);
this.context = context;
System.out.println("I am in the custom Adapter class "+ context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
System.out.println("This is the get view");
View row = convertView;
if (row == null) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = mInflater.inflate(R.layout.todo_row, parent, false);
}
ImageButton chkDone = (ImageButton) row.findViewById(R.id.chkDone);
chkDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ListView listView = (ListView) parentRow.getParent();
final int position = listView.getPositionForView(parentRow);
System.out.println("I am in position "+ position);
}
});
return row;
}
}
XML такой же.
Он компилируется, но ничего не делает и теперь даже не показывает строку... Дайте мне знать, если вам нужно, чтобы я опубликовал код, который создает matrixCursor.
Большое спасибо, очень признателен.
ToDolv.setOnItemClickListener
, что не сработает. Вам нужно посмотреть на создание пользовательского адаптера для вашего списка и установить событие click для ваше изображение там. Эта ссылка может помочь stackoverflow.com/questions/8166497/ - person Dreagen   schedule 23.04.2015SimpleCursorAdapter
, он еще не создал собственный адаптер для списка, что является основной проблемой - person Dreagen   schedule 23.04.2015List<String>
, содержащий все элементы в вашем массиве строкcolumnNames
, который вы передали в старыйSimpleCursorAdapter
- person Dreagen   schedule 23.04.2015List<Object>
. Я попытаюсь написать ответ, чтобы показать, что я имею в виду. - person Dreagen   schedule 23.04.2015