Java 上下文菜单显示正确的数据,但listview不显示';T
我有一个非常奇怪的问题,在过去的几个小时里我一直在试图解决,但我找不到哪里出了问题。我有一个包含名称和少量文本的SQLite数据库。当我点击listview时,我会看到连接到名称的文本。但我也有一个“添加到收藏夹”功能,当我将某个内容添加到收藏夹列表时,它会显示在另一个活动中。在新建/收藏夹列表视图(名称、标题和图像)中显示的信息是正确的,但当我单击它时,显示的数据是错误的 在我的原始列表视图中有10行,在我的“收藏”列表视图中,它的顺序与第一行相同。如果我添加了一部电影,例如《卡萨布兰卡》,它在我的原始列表中位于第7位,它将在我的新列表视图中位于第一位(位置0),并显示正确的演员、封面和作者。但当我点击它查看更多信息时(开始新的活动)。它仅显示原始列表视图中的信息以及位置0上的电影中的信息 但是如果我点击我的上下文菜单来检查它。它显示了我想要查看的所有正确数据。这太奇怪了,我希望有人知道问题出在哪里?我用数组和字符串/stringbuilder等尝试了很多不同的组合和解决方案。这是我来这里之前写的最后一段代码Java 上下文菜单显示正确的数据,但listview不显示';T,java,android,sqlite,listview,android-listview,Java,Android,Sqlite,Listview,Android Listview,我有一个非常奇怪的问题,在过去的几个小时里我一直在试图解决,但我找不到哪里出了问题。我有一个包含名称和少量文本的SQLite数据库。当我点击listview时,我会看到连接到名称的文本。但我也有一个“添加到收藏夹”功能,当我将某个内容添加到收藏夹列表时,它会显示在另一个活动中。在新建/收藏夹列表视图(名称、标题和图像)中显示的信息是正确的,但当我单击它时,显示的数据是错误的 在我的原始列表视图中有10行,在我的“收藏”列表视图中,它的顺序与第一行相同。如果我添加了一部电影,例如《卡萨布兰卡》,它
public class Favorites extends ActionBarActivity {
DatabaseHelper dbHelper;
ListView favoritesListView;
Cursor myCursor;
String[] myStringArray = new String[3];
ListViewCursorAdapter myFavsAdapter;
String openBookCmeny = "Öppna boken";
String rmvFavsCmeny = "Ta bort från dina favoriter";
String webSiteCmeny = "Klicka här för mer information på bokens hemsida";
String showWebSiteCmeny;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_favorites);
dbHelper = DatabaseHelper.getInstance(this);
myCursor = dbHelper.visaFavoriter();
dbHelper.getWritableDatabase();
myFavsAdapter = new ListViewCursorAdapter(this, myCursor);
favoritesListView = (ListView)findViewById(R.id.favoritesListView);
favoritesListView.setAdapter(myFavsAdapter);
registerForContextMenu(favoritesListView);
favoritesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Cursor c = (Cursor)myFavsAdapter.getItem(view.getId());
myStringArray[1]= c.getString(4);
Intent i = new Intent(Favorites.this, VisaBoken.class);
i.putExtra(null, myStringArray);
startActivity(i);
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
Cursor c = ((Cursor) myFavsAdapter.getItem(info.position));
String cTitle = c.getString(2);
menu.setHeaderTitle(cTitle);
menu.add(0, v.getId(), 0, openBookCmeny);
menu.add(0, v.getId(), 0, rmvFavsCmeny);
menu.add(0, v.getId(), 0, webSiteCmeny);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
Cursor c = ((Cursor) myFavsAdapter.getItem(info.position));
myStringArray[0] = c.getString(0);
myStringArray[1] = c.getString(4);
showWebSiteCmeny = c.getString(6);
if (item.getTitle() == openBookCmeny){
Intent i = new Intent(Favorites.this, VisaBoken.class);
i.putExtra(null, myStringArray);
startActivity(i);
}
else if (item.getTitle() == rmvFavsCmeny){
dbHelper.removeOneFavorite(myStringArray[0]);
recreate();
}
else if (item.getTitle() == webSiteCmeny){
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(showWebSiteCmeny));
startActivity(browserIntent);
}
return super.onContextItemSelected(item);
}
公共类收藏夹扩展了ActionBarActivity{
数据库助手dbHelper;
列表视图收藏夹列表视图;
游标myCursor;
字符串[]myStringArray=新字符串[3];
ListViewCursorAdapter MyFavAdapter;
字符串openBookCmeny=“Öppna boken”;
字符串rmvFavsCmeny=“Ta bort från dina favoriter”;
String webSiteCmeny=“Klicka här för mer information påbokens hemsida”;
字符串showWebSiteCmeny;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_收藏夹);
dbHelper=DatabaseHelper.getInstance(this);
myCursor=dbHelper.visaFavoriter();
dbHelper.getWritableDatabase();
myFavsAdapter=新的ListViewCursorAdapter(此为myCursor);
favoritesListView=(ListView)findViewById(R.id.favoritesListView);
setAdapter(myFavsAdapter);
registerForContextMenu(favoritesListView);
favoritesListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
游标c=(游标)myFavsAdapter.getItem(view.getId());
myStringArray[1]=c.getString(4);
Intent i=新Intent(Favorites.this、VisaBoken.class);
i、 putExtra(null,myStringArray);
星触觉(i);
}
});
}
@凌驾
public void onCreateContextMenu(ContextMenu菜单,视图v,ContextMenu.ContextMenuInfo菜单信息){
super.onCreateContextMenu(menu,v,menuInfo);
AdapterView.AdapterContextMenuInfo信息=(AdapterView.AdapterContextMenuInfo)菜单信息;
游标c=((游标)myFavsAdapter.getItem(info.position));
String cTitle=c.getString(2);
菜单设置标题(cTitle);
添加(0,v.getId(),0,openBookCmeny);
添加(0,v.getId(),0,rmvFavsCmeny);
添加(0,v.getId(),0,webSiteCmeny);
}
@凌驾
公共布尔值onContextItemSelected(MenuItem项){
AdapterView.AdapterContextMenuInfo信息=(AdapterView.AdapterContextMenuInfo)项。getMenuInfo();
游标c=((游标)myFavsAdapter.getItem(info.position));
myStringArray[0]=c.getString(0);
myStringArray[1]=c.getString(4);
showWebSiteCmeny=c.getString(6);
if(item.getTitle()==openBookCmeny){
Intent i=新Intent(Favorites.this、VisaBoken.class);
i、 putExtra(null,myStringArray);
星触觉(i);
}
else if(item.getTitle()==rmvFavsCmeny){
dbHelper.removeOneFavorite(myStringArray[0]);
重新创建();
}
else if(item.getTitle()==webSiteCmeny){
Intent-browserint=新的Intent(Intent.ACTION_视图,Uri.parse(showWebSiteCmeny));
startActivity(浏览器内容);
}
返回super.onContextItemSelected(项目);
}
获取用于显示它的意图和信息的类
public class VisaBoken extends ActionBarActivity implements AdapterView.OnItemClickListener {
ActionBarDrawerToggle myDrawerToggle;
DrawerLayout myDrawerLayout;
ListView myDrawerListView;
ArrayList<DrawerMenuName> myDrawerMenuName = new ArrayList<>();
DatabaseHelper dbHelper;
public static final String COL_ID = "_id";
public static String Tag = "checkIDfromDB";
TextView visaBokenTV;
String[] myStringArray = new String[2];
String[] myStringArray2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visa_boken);
visaBokenTV = (TextView)findViewById(R.id.visaBokenTV);
Bundle extras = getIntent().getExtras();
myStringArray = extras.getStringArray(null);
visaBokenTV.setText(myStringArray[1]);
myDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
dbHelper = DatabaseHelper.getInstance(this);
dbHelper.getWritableDatabase();
公共类VisaBoken扩展ActionBarActivity实现AdapterView.OnItemClickListener{
ActionBarDrawerToggle myDrawerToggle;
抽屉布局我的抽屉布局;
列表视图myDrawerListView;
ArrayList myDrawerMenuName=新的ArrayList();
数据库助手dbHelper;
公共静态最终字符串COL_ID=“_ID”;
公共静态字符串Tag=“checkIDfromDB”;
TextView visaBokenTV;
字符串[]myStringArray=新字符串[2];
字符串[]myStringArray2;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visa_boken);
visaBokenTV=(TextView)findViewById(R.id.visaBokenTV);
Bundle extras=getIntent().getExtras();
myStringArray=extras.getStringArray(null);
visaBokenTV.setText(myStringArray[1]);
myDrawerLayout=(DrawerLayout)findViewById(R.id.drawer\U布局);
dbHelper=DatabaseHelper.getInstance(this);
dbHelper.getWritableDatabase();
很抱歉,我没有完全理解您对问题的解释。但是我看到一个可疑的代码。
建议,在public void中更改代码,单击from:
Cursor c = (Cursor)myFavsAdapter.getItem(view.getId());
致:
通常,要使用getItem(),需要在ListView中传递位置,从值0开始为顶部。除非为各种视图对象设置了ID,否则不能使用view.getId()
,但我认为您没有这样做,听起来太棘手了。也许您应该发布适配器(myFavsAdapter
)代码
让我们先试试,直到我看到其他问题。谢谢!它工作得很好,问题是我以前使用过该代码,但后来我无法从另一个类中获取位置。这有点难以解释,但在您的解决方案之后,我现在意识到我已经忘记了
Cursor c = (Cursor)myFavsAdapter.getItem( position );