位置和 ID 在 ListView 中总是返回相同的值
Position and ID are always returning same value in ListView
我的 ListView 有点问题,在 OnItemLongClickListener 中时,它既没有给我正确的位置也没有给我正确的 ID。
ListView 正确显示所有条目,但在长项目上单击它 returns 我将条目总和作为位置(与我单击的项目无关)和所有条目的最高 ID。
正因为如此,我无法获得条目的正确 ID(我的自定义适配器中确实有)。我做错了什么?
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
//Here I want to delete the selected entry..
//both position and id are returning the same value:
// when there are three items in the list, the position would be three for all entries,
// while the id would be the value of the latest entry.
showDeleteSingleEntryDialog(id);
return true;
}
});
我使用 AsyncTask 填充列表视图,如下所示(通过在片段内的 OnCreateView 中调用 AsyncTask)
private class DisplayEntriesAsyncTask extends AsyncTask<Void,Void,Void>{
Cursor data;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
data = mDatabaseHelper.getDiaryEntriesCurrentUser(userID);
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
listData = new ArrayList<>();
if (data == null || data.getCount() < 1) {
mTextView.setText("Keine Einträge vorhanden!");
} else {
try {
while (data.moveToNext()){
listData.add(data.getString(1));
}
} catch (CursorIndexOutOfBoundsException e){
//...
}
}
adapter = new DiaryCursorAdapter(getContext(), data);
mListView.setAdapter(adapter);
}
}
最后,这是我的自定义适配器
public class DiaryCursorAdapter extends CursorAdapter {
Context context;
private long ident;
public DiaryCursorAdapter(Context context, Cursor c) {
super(context, c, 0);
this.context = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ident = cursor.getLong(0);
TextView title = (TextView) view.findViewById(R.id.listitem_title);
title.setText(cursor.getString(1));
TextView location = (TextView) view.findViewById(R.id.listitem_location);
location.setText(cursor.getString(3));
TextView date = (TextView) view.findViewById(R.id.listitem_date);
date.setText(cursor.getString(4));
TextView content = (TextView) view.findViewById(R.id.listitem_content);
content.setText(cursor.getString(2));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
return layoutInflater.inflate(R.layout.listview_diary_entries, parent, false);
//return view;
}
@Override
public long getItemId(int position) {
return ident;
}}
我试图在没有 AsyncTask 的情况下填充列表视图。
顺便说一下,相应布局文件中ListView的父级是LinearLayout(不是scrollview,我发现这是一个可能的问题)。
项目 ID 最终将通过调用 getItemId() 进行 return编辑,因此您将其覆盖为 return "ident",这是您的 CursorAdaptor [=16] 私有的=] 并将针对每一行进行更改。
您需要将您的 ident 更改为 ident 的 ArrayList(或类似的东西),您可以通过传递到 getItemId() 调用的 'position' 的值访问它。
要使@pskink 和@karora 的评论成为答案:
我错误地覆盖了 getItemID
,这导致了我上面描述的行为。
所以,删除覆盖方法确实解决了我的问题。
我的 ListView 有点问题,在 OnItemLongClickListener 中时,它既没有给我正确的位置也没有给我正确的 ID。
ListView 正确显示所有条目,但在长项目上单击它 returns 我将条目总和作为位置(与我单击的项目无关)和所有条目的最高 ID。 正因为如此,我无法获得条目的正确 ID(我的自定义适配器中确实有)。我做错了什么?
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
//Here I want to delete the selected entry..
//both position and id are returning the same value:
// when there are three items in the list, the position would be three for all entries,
// while the id would be the value of the latest entry.
showDeleteSingleEntryDialog(id);
return true;
}
});
我使用 AsyncTask 填充列表视图,如下所示(通过在片段内的 OnCreateView 中调用 AsyncTask)
private class DisplayEntriesAsyncTask extends AsyncTask<Void,Void,Void>{
Cursor data;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
data = mDatabaseHelper.getDiaryEntriesCurrentUser(userID);
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
listData = new ArrayList<>();
if (data == null || data.getCount() < 1) {
mTextView.setText("Keine Einträge vorhanden!");
} else {
try {
while (data.moveToNext()){
listData.add(data.getString(1));
}
} catch (CursorIndexOutOfBoundsException e){
//...
}
}
adapter = new DiaryCursorAdapter(getContext(), data);
mListView.setAdapter(adapter);
}
}
最后,这是我的自定义适配器
public class DiaryCursorAdapter extends CursorAdapter {
Context context;
private long ident;
public DiaryCursorAdapter(Context context, Cursor c) {
super(context, c, 0);
this.context = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ident = cursor.getLong(0);
TextView title = (TextView) view.findViewById(R.id.listitem_title);
title.setText(cursor.getString(1));
TextView location = (TextView) view.findViewById(R.id.listitem_location);
location.setText(cursor.getString(3));
TextView date = (TextView) view.findViewById(R.id.listitem_date);
date.setText(cursor.getString(4));
TextView content = (TextView) view.findViewById(R.id.listitem_content);
content.setText(cursor.getString(2));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
return layoutInflater.inflate(R.layout.listview_diary_entries, parent, false);
//return view;
}
@Override
public long getItemId(int position) {
return ident;
}}
我试图在没有 AsyncTask 的情况下填充列表视图。 顺便说一下,相应布局文件中ListView的父级是LinearLayout(不是scrollview,我发现这是一个可能的问题)。
项目 ID 最终将通过调用 getItemId() 进行 return编辑,因此您将其覆盖为 return "ident",这是您的 CursorAdaptor [=16] 私有的=] 并将针对每一行进行更改。
您需要将您的 ident 更改为 ident 的 ArrayList(或类似的东西),您可以通过传递到 getItemId() 调用的 'position' 的值访问它。
要使@pskink 和@karora 的评论成为答案:
我错误地覆盖了 getItemID
,这导致了我上面描述的行为。
所以,删除覆盖方法确实解决了我的问题。