我有一个应用程序,可以在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){
}
答案 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();