Java ArrayList在CursorAdapter中工作不正常

Java 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个值,然后再

我正在尝试从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,它扩展了CursorAdapter


在这张图片中,我单击了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()