视图中的android光标必须是最终的?
我有一个活动,它在ListView中显示数据库中的用户消息。ListView正确显示有关消息的各种信息,并且ListView中的每一行都有一个onClickListener,它启动另一个活动以显示有关消息的更多信息 这一切都很好。我在列表行中添加了一个复选框。选中该复选框以标记已选择要删除的邮件。每条消息都有一个唯一的guid标识符,该标识符存储在DB中,因此可通过视图中的光标和适配器使用。单击一行时,该quid将通过onclicklistener传递给下一个活动 这一切都很好。我现在在复选框中添加了一个onCheckedChanged侦听器。当我选中该复选框时,我想从getView中的光标获取这个唯一的guid标识符 当复选框设置了它的onCheckedChanged侦听器时,它使用一个无注释的内部类,这就是为什么游标nedds是最终的 不幸的是,这意味着如果数据库中有5条消息,并且我选中了所有要删除的消息,那么所有消息都具有相同的guid,因为一旦将其设置为第一个值,就无法更改(为最终值) 我理解为什么它必须是final,就好像annonymous内部类的持续时间比创建游标的位置长,那么监听器将具有对不存在的对象的引用 我怎样才能解决这个问题?基本上,我如何使光标中的数据在复选框的onCheckedChanged方法中可用,而不使光标成为最终的 提前谢谢视图中的android光标必须是最终的?,android,view,cursor,Android,View,Cursor,我有一个活动,它在ListView中显示数据库中的用户消息。ListView正确显示有关消息的各种信息,并且ListView中的每一行都有一个onClickListener,它启动另一个活动以显示有关消息的更多信息 这一切都很好。我在列表行中添加了一个复选框。选中该复选框以标记已选择要删除的邮件。每条消息都有一个唯一的guid标识符,该标识符存储在DB中,因此可通过视图中的光标和适配器使用。单击一行时,该quid将通过onclicklistener传递给下一个活动 这一切都很好。我现在在复选框中
public class ViewMessagesActivity extends Activity{
private static final String TAG = ViewMessagesActivity.class.getSimpleName();
final String BACKPRESS_ACTION = "com.carefreegroup.rr3.BACKPRESS_ACTION";
NfcScannerApplication nfcscannerapplication;
Cursor cursorMessages;
ListView listView;
SimpleCursorAdapter adapter;
MyAdapter myAdapter;
TextView noMessages;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewmessages);
nfcscannerapplication = (NfcScannerApplication) getApplication();
//transactionCount = (TextView)findViewById(R.id.textviewtransactionsfordaycount);
listView = (ListView) findViewById(R.id.listviewmessages);
noMessages = (TextView)findViewById(R.id.textviewnomessageslabel);
// get data
cursorMessages = nfcscannerapplication.loginValidate.queryAllFromMessage();
cursorMessages.moveToLast();
startManagingCursor(cursorMessages);
// setup adapter and show the data
if(cursorMessages.getCount() == 0){
noMessages.setVisibility(View.VISIBLE);
listView.setVisibility(View.GONE);
}else{
listView.setVisibility(View.VISIBLE);
noMessages.setVisibility(View.GONE);
}
String[] from = {
LoginValidate.C_MESSAGE_CREATED_AT, LoginValidate.C_MESSAGE_TEXT, LoginValidate.C_MESSAGE_SENDER};
int[] to = { R.id.messagecreatedat, R.id.messagetext, R.id.messagesender};
myAdapter = new MyAdapter(nfcscannerapplication, R.layout.rowmessages, cursorMessages, from, to);
listView.setAdapter(myAdapter);
listView.setOnItemClickListener(myAdapter);
}//end of onCreate
@Override
protected void onResume() {
super.onResume();
}
private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {
public MyAdapter(Context context, int layout, Cursor c, String[] from,
int[] to) {
super(context, layout, c, from, to);
}
@Override
public
View getView(int position, View convertView, ViewGroup parent) {
Log.e(TAG, "inside myadapter getview for messages");
View v = super.getView(position, convertView, parent);
if(v == null)
return null;
Cursor c = (Cursor)getItem(position);
v.setTag(c);
String messageSender = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_SENDER));
String isRepliedTo = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_REPLIED));
String isStandAlone = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_IS_STANDALONE));
((TextView)v.findViewById(R.id.messagecreatedat)).setText(formattedMessCreatedAt );
((TextView)v.findViewById(R.id.messagetext)).setText(messageText);
((TextView)v.findViewById(R.id.messagesender)).setText(messageSender);
//#003F87 = blue
((TextView)v.findViewById(R.id.messagecreatedat)).setTextColor(Color.parseColor("#003F87"));
((TextView)v.findViewById(R.id.messagesender)).setTextColor(Color.parseColor("#003F87"));
((TextView)v.findViewById(R.id.messagetext)).setTextColor(Color.parseColor("#FF0000"));
CheckBox cb = ((CheckBox)v.findViewById(R.id.list_checkbox));
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String messageGuid = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_GUID));
if(isChecked == true){
Log.e(TAG, "checkBox true and guid = " + messageGuid);
}else{
Log.e(TAG, "checkBox false and guid = " + messageGuid);
}
}
});
return v;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int pos,
long id) {
Cursor itemCursor = (Cursor) view.getTag();
String messageGuid = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_GUID));
String messageText = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_TEXT));
String messageCreatedAt = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_CREATED_AT));
String messageSender = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_SENDER));
String messageReplied = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_REPLIED));
String messageSeen = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_SEEN));
String isStandAlone = itemCursor.getString(itemCursor.getColumnIndex(LoginValidate.C_MESSAGE_IS_STANDALONE));
Intent i = new Intent(ViewMessagesActivity.this, ReplyToMessageActivity.class);
i.putExtra("guid", messageGuid);
i.putExtra("message", messageText);
i.putExtra("createdat", messageCreatedAt);
i.putExtra("sender", messageSender);
i.putExtra("messagereplied", messageReplied);
i.putExtra("messageseen", messageSeen);
i.putExtra("isstandalone", isStandAlone);
startActivity(i);
}
}// end of adapter
}
你有这个
Cursor c = (Cursor)getItem(position);
然后
因为它的内部类是匿名的,所以它要求游标是final
。看看这些文件
为了避免这种情况,请将其声明为实例变量
private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {
Cursor c;
然后在getView
c = (Cursor)getItem(position);
你也应该考虑使用<代码> ViewHolder <代码>模式
另外,您可以在xml中使用1来代替2个布局
LinearLayout
和RelativeLayout
,使光标成为全局的,并在需要在一个光标变量中执行不同类型的操作时使用布尔变量。@Ragunandan感谢您的回复。我现在不需要最后的修饰符,但是onCheckedChanged中的变量messageGuid对于每一行总是相同的值。有什么想法吗?@ TurtLoBOY,你还需要考虑ListVIEW视图回收。检查这个,如果它有帮助@Ragunandan好的,谢谢,我会看看你的建议,当我让它工作。我已经用Log.e(TAG,”(cursor)getItem(position)=“+c)注销了游标;我在[edit1]上发布的结果。@turtleboy在getView
中,你在哪里膨胀版面,我看不到any@Ragunandan对不起,你什么意思?我的所有视图都从v变量中膨胀,例如CheckBox cb=((CheckBox)v.findViewById(R.id.list_CheckBox));对不起,我没听清你的意思。
CheckBox cb = ((CheckBox)v.findViewById(R.id.list_checkbox));
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String messageGuid = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_GUID));
private class MyAdapter extends SimpleCursorAdapter implements OnItemClickListener {
Cursor c;
c = (Cursor)getItem(position);