Android在自定义ListView中存储SQLite数据库行ID

时间:2015-04-17 13:59:26

标签: android sqlite listview

我有一个应用程序,可以在SQLite数据库中存储三个字符串。在另一个活动中,我查询数据库并使用字符串填充自定义ListView。为此,我实现了一个BaseAdapter来管理自定义ListView的布局。

public class DataAdapter extends BaseAdapter{
    ArrayList<DictionaryItem> wordList = new ArrayList<DictionaryItem>();
    LayoutInflater inflater;
    Context context;

    public DataAdapter(Context context, ArrayList<DictionaryItem> wordList) {
        this.wordList = wordList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);    // only context can also be used
    }

    @Override
    public int getCount() {
        return wordList.size();
    }

    @Override
    public Object getItem(int position) {
        return wordList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.word_layout, null);
            holder = new ViewHolder();
            holder.tvEnglish = (TextView) convertView.findViewById(R.id.tvEnglish);
            holder.tvSpanish = (TextView) convertView.findViewById(R.id.tvSpanish);
            holder.tvSpanishFilename = (TextView) convertView.findViewById(R.id.tvSpanishFilename);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvEnglish.setText(wordList.get(position).getEnglish());
        holder.tvSpanish.setText(wordList.get(position).getSpanish());
        holder.tvSpanishFilename.setText(wordList.get(position).getSpanishFilename());

        return convertView;
    }

    static class ViewHolder {
        TextView tvSpanish, tvEnglish, tvSpanishFilename;
    }
}

我还想做的是将db条目的row_id存储在ListView中,如果我想从数据库中删除该条目,则检索row_id。

我看过与使用setTag相关的帖子,但我不确定如何在使用ViewHolder时这样做,因为该方法似乎解决了在我的布局中向视图添加内容的问题。我不认为row_id是一个要在我的ListView中显示的项目。

我们将不胜感激。

我正朝着这个方向努力,已经有了这样做的方法。但是,当我设置适配器时,我不确定如何访问row_id。例如,在ListView onclick中,我可以在自定义视图中恢复项目,如:

TextView tv =(TextView)view.findViewById(R.id.tvEnglish);

但我没有为row_id设置任何视图,因此我不知道如何获取它。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dictionary);
        lvWords = (ListView) findViewById(R.id.lvWords);
        getDataInList();
        da = new DataAdapter(context, wordList);
        lvWords.setAdapter(da);

....

    private void getDataInList() {
        try {
            ManageDictionary md = new ManageDictionary(context);
            md.open();
            ArrayList<DictionaryItem> ml = md.getArrayData();

            for (int i = 0; i < ml.size(); i++) {
                DictionaryItem di = new DictionaryItem();
                di.setRowId(ml.get(i).getRowId());
                di.setEnglish(ml.get(i).getEnglish());
                di.setSpanish(ml.get(i).getSpanish());
                di.setSpanishFilename(ml.get(i).getSpanishFilename());
                // Add this object into the ArrayList myList
                wordList.add(di);
            }
            md.close();
        } catch (Exception e){

        }

2 个答案:

答案 0 :(得分:1)

在您的DictionaryItem类中添加long类型的字段并将其命名为 id 生成一个getter和一个setter。 在查询时设置id,然后你可以使用getter。

好的,如果我理解正确,那么这就是你应该做的。

在activity中删除你的wordList ArrayList,因为没有任何意义,因为你在适配器中有相同的列表。

修改你的获取数据列表方法,使它像这样..使用for循环也没有意义。

     private void getDataInList() {
            try {
                ManageDictionary md = new ManageDictionary(context);
                md.open();
                da = new DataAdapter(context,  md.getArrayData());
                md.close();
            } catch (Exception e){

            }
       }

现在更改适配器中的wordList变量,使其像这样

public ArrayList<DictionaryItem> wordList = new ArrayList<DictionaryItem>();

这样你只能有一个arraylist,但仍然可以在你的活动中使用它。

现在,如果要从适配器中删除具有特定ID的项目,则需要搜索它。如果你已经知道它的位置,那就更好了。

无论如何,您需要前两种方法来删除项目。第三个,如果您需要具有特定ID的项目。

public void deleteItemWithID(long id){
    int length = wordList.length();
    for(int i = 0; i < length; ++i){
        if(wordList.get(i).getRowId() == id){
            removeItemAtPostion(i);
            return;
        }
    }
}

public void removeItemAtPostion(int postion){
    wordList.remove(i);
    notifyDataSetChanged(); //This tells the listview to redraw itself
}

public DictionaryItem findItemById(long id){
    int length = wordList.length();
    for(int i = 0; i < length; ++i){
        if(wordList.get(i).getRowId() == id){
            return wordList.get(i);
        }
    }
    return null;
}

答案 1 :(得分:0)

使用ListViews&#39; onclicklister我能够通过父变量访问我的DictionaryItem项目。

public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
DataAdapter da = (DataAdapter)parent.getAdapter();
String row_id = String.valueOf(da.wordList.get(position).getRowId());
Toast.makeText(Dictionary.this, row_id + " id", Toast.LENGTH_LONG).show();