Java ArrayList在CursorAdapter中工作不正常
我正在尝试从SQLite数据库获取数据库,尝试填充ListView,并在ArrayList中添加数据。ListView填充得很好,但问题是ArrayList填充得不好 假设数据库中有如下数据: A. B C D E F G H 我 J K L M N ........ 我的ListView以这种方式显示数据。但是ArrayList以这种方式添加数据: A. B C D E F A. B C D E F G H 这意味着我的ArrayList先获取6个值,然后重复它,然后获取下一个6个值,然后再次重复它。这意味着当我从列表视图中单击项目H时,ArrayList会显示B。我不知道为什么会发生这种情况 我的代码,CustomList,它扩展了CursorAdapterJava ArrayList在CursorAdapter中工作不正常,java,android,sqlite,arraylist,android-cursoradapter,Java,Android,Sqlite,Arraylist,Android Cursoradapter,我正在尝试从SQLite数据库获取数据库,尝试填充ListView,并在ArrayList中添加数据。ListView填充得很好,但问题是ArrayList填充得不好 假设数据库中有如下数据: A. B C D E F G H 我 J K L M N ........ 我的ListView以这种方式显示数据。但是ArrayList以这种方式添加数据: A. B C D E F A. B C D E F G H 这意味着我的ArrayList先获取6个值,然后重复它,然后获取下一个6个值,然后再
在这张图片中,我单击了Shirajganj,但是祝酒词显示230 Thakurgaon position=230是正确的,但是city_name.get230应该是Shirajganj。当我试图在CustomList的binView中为ArrayList添加值时,我认为这是错误的。我怎样才能解决这个问题 在bindView方法中填充该数组不是一个好主意。Android不会为列表中的每一行创建单独的视图,而是使用已经创建的视图,这就是为什么您总是在arraylist中收到意外结果的原因。最好是在活动中填充数组,而不是适配器。只需查询数据库以获得相同的结果,如下所示:
Cursor cursor = getContentResolver().query(
uri,
projection,
selectionClause
selectionArgs,
sortOrder);
while (cursor.moveToNext ()){
arrayList.add(cursor.getAsString(cursor.getColumnIndex('column_name')));
}
cursor.close()
为什么不使用Set而不是ArrayList来避免重复的值呢?如果数据库有任何重复的值,我没有问题。但是我希望ArrayList能够很好地增加价值。这就是ListView在不能正确生成listitem视图时的工作方式。这与arraylist毫无关系。在你回答之前,我已经解决了这个问题。你说得对。谢谢你的回答。
import java.io.IOException;
import java.util.ArrayList;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;
public class AllCityListFragment extends Fragment {
private CustomList customAdapter;
private DatabaseHelper databaseHelper;
ArrayList<String> city_name = new ArrayList<String>();
ArrayList<String> country_name = new ArrayList<String>();
ArrayList<String> country_short = new ArrayList<String>();
ArrayList<CheckBox> check_box = new ArrayList<CheckBox>();
public static final String ARG_OS = "OS";
int pos;
String sql = "";
ListView list;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.all_city_layout, null);
databaseHelper = new DatabaseHelper(view.getContext());
try {
databaseHelper.createDataBase();
databaseHelper.openDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(view.getContext(), "Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
list = (ListView) view.findViewById(R.id.citylist);
list.setFocusable(false);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View myview,
int position, long id) {
Toast.makeText(getActivity(),
position + " " + city_name.get(position),
Toast.LENGTH_LONG).show();
}
});
sql = "SELECT _id, city_name, country_name, country_short, favorite FROM city order by country_name asc;";
new Handler().post(new Runnable() {
@Override
public void run() {
customAdapter = new CustomList(getActivity(), databaseHelper
.getResult(sql), city_name, country_name,
country_short, check_box);
list.setAdapter(customAdapter);
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
Cursor cursor = getContentResolver().query(
uri,
projection,
selectionClause
selectionArgs,
sortOrder);
while (cursor.moveToNext ()){
arrayList.add(cursor.getAsString(cursor.getColumnIndex('column_name')));
}
cursor.close()