问题描述
- 如何从自定义列表视图获得选中的项?
-
程序中的自定义列表视图的每一行都包含许多TextViews,当我点击List Item时,OnListItemClick()没有被调用。如何获取一个自定义列表视图中选中的项?
XML for Row:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/priorityView" android:layout_width="20dip" android:layout_height="match_parent" android:background="#cccccc" android:layout_marginTop="2dip" android:layout_marginBottom="2dip" /> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:weightSum="1.0" > <TextView android:id="@+id/dateText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingBottom="2dip" android:paddingLeft="5dip" android:paddingRight="5dip" android:paddingTop="2dip" android:text="@string/empty" android:textSize="20dip" android:textStyle="bold" /> <TextView android:id="@+id/monthText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:padding="5dip" android:text="@string/empty" android:textSize="10dip" > </TextView> </LinearLayout> <TextView android:id="@+id/timeText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dip" android:text="@string/empty" > </TextView> <TextView android:id="@+id/titleText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="5dip" android:text="@string/empty" android:textStyle="bold" android:layout_weight="1.0" > </TextView> <CheckBox android:id="@+id/selectedCheckbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="5dip" > </CheckBox> </LinearLayout>
XML for ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_centerVertical="true" > </ListView> </RelativeLayout>
Java
public class MainActivity extends ListActivity { private AppointmentsDB dbHelper; private Cursor cursor; private AppointmentsCursorAdapter cursorAdapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new AppointmentsDB(this); StringBuilder selectQuery = new StringBuilder(); selectQuery.append("SELECT "+AppointmentsDB.KEY_ID+","); selectQuery.append(AppointmentsDB.KEY_TITLE + ", "); selectQuery.append(AppointmentsDB.KEY_DESCRIPTION + ", "); selectQuery.append(AppointmentsDB.KEY_PRIORITY + ", "); selectQuery.append(AppointmentsDB.KEY_DATE_TIME + ", "); selectQuery.append(AppointmentsDB.KEY_DURATION + ", "); selectQuery.append(AppointmentsDB.KEY_ALARM_TIME + " FROM " + AppointmentsDB.DATABASE_TABLE + " "); selectQuery.append("ORDER BY " + AppointmentsDB.KEY_DATE_TIME + " ASC"); cursor = dbHelper.openReadableDatabase().rawQuery( selectQuery.toString(), null); String[] columnNames = new String[] { }; int[] ids = new int[] { }; cursorAdapter = new AppointmentsCursorAdapter(this, R.layout.row, cursor, columnNames, ids); this.setListAdapter(cursorAdapter); } // This class sets our customised layout for the ListView class AppointmentsCursorAdapter extends SimpleCursorAdapter { private int layout; private int[] colours; @SuppressWarnings("deprecation") public AppointmentsCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); this.layout = layout; colours = new int[] { context.getResources().getColor(R.color.light_gray), context.getResources().getColor(R.color.green), context.getResources().getColor(R.color.orange), context.getResources().getColor(R.color.brick_red) }; } public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View view = inflater.inflate(layout, parent, false); TextView titleText = (TextView) view.findViewById(R.id.titleText); TextView priorityView = (TextView) view .findViewById(R.id.priorityView); TextView dateText = (TextView) view.findViewById(R.id.dateText); TextView monthText = (TextView) view.findViewById(R.id.monthText); TextView timeText = (TextView) view.findViewById(R.id.timeText); String title = cursor.getString(cursor .getColumnIndex(AppointmentsDB.KEY_TITLE)); int priority = 0; String _priority = cursor.getString(cursor.getColumnIndex(AppointmentsDB.KEY_PRIORITY)); if(_priority != null) priority = Integer.parseInt(_priority); long dateTime = Long.parseLong(cursor.getString(cursor .getColumnIndex(AppointmentsDB.KEY_DATE_TIME))); Calendar calendar = new GregorianCalendar(); calendar.setTimeInMillis(dateTime); SimpleDateFormat timeFormat = new SimpleDateFormat( "dd,MMM,HH:mm aaa"); String[] tokens = timeFormat.format(calendar.getTime()).split(","); dateText.setText(tokens[0]); monthText.setText(tokens[1]); timeText.setText(tokens[2]); titleText.setText(title); priorityView.setBackgroundColor(colours[priority]); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { super.bindView(view, context, cursor); TextView titleText = (TextView) view.findViewById(R.id.titleText); TextView priorityView = (TextView) view .findViewById(R.id.priorityView); TextView dateText = (TextView) view.findViewById(R.id.dateText); TextView monthText = (TextView) view.findViewById(R.id.monthText); TextView timeText = (TextView) view.findViewById(R.id.timeText); String title = cursor.getString(cursor .getColumnIndex(AppointmentsDB.KEY_TITLE)); int priority =0; String _priority = cursor.getString(cursor .getColumnIndex(AppointmentsDB.KEY_PRIORITY)); if(_priority != null) priority = Integer.parseInt(_priority); long dateTime = Long.parseLong(cursor.getString(cursor .getColumnIndex(AppointmentsDB.KEY_DATE_TIME))); Calendar calendar = new GregorianCalendar(); calendar.setTimeInMillis(dateTime); SimpleDateFormat timeFormat = new SimpleDateFormat( "dd,MMM,HH:mm aaa"); String[] tokens = timeFormat.format(calendar.getTime()).split(","); dateText.setText(tokens[0]); monthText.setText(tokens[1]); timeText.setText(tokens[2]); titleText.setText(title); priorityView.setBackgroundColor(colours[priority]); } } }
解决方案
是不是每行的复选框checkbox把焦点抢掉了,试试设置下焦点
在checkbox中添加android:focusable="false"
解决方案二:
使用 OnItemClick(),不用 OnListItemClick()。
发送光标,然后通过 SimpleCursorAdapter 创建 Custom listview。
SimpleCursorAdapter yearadapter =
new SimpleCursorAdapter(this, R.layout.listview, yearcursor, yearfrom, yearto);
setListAdapter(yearadapter);
amount.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//Your code when item get clicked
}
});
时间: 2025-01-07 08:22:26