2016-05-17 13 views
0

私は各アイテムがタイトル、文字列とボタンのArrayListから、ArrayListの各エントリが新しいリスト項目を作成するようにします。Android:リストビューからのインデックスを使用してデータベースから削除 - リストで作成されたビューで作成されたIDの配列にアクセスできない

また、対応する主キーの別のArrayListがあります。これは、SQLiteデータベースから特定のアイテムを削除するために使用したいものですが、リストビューでは使用されません(IDは表示しません。リストをpoplulateする文字列は必ずしも一意ではないため、削除に使用することはできません)。

リストビューのgetViewメソッドには、ユーザーが削除ボタンをクリックしたときにボタンが押された位置がわかっているので、うまくいけば呼び出すことができますid [position]を使ったデータベースの削除メソッドですが、リストビュー自体がアクティビティの後に作成されているため、id配列を解決できないのでdeleteを呼び出すことはできません。

public class TodayListActivity extends AppCompatActivity { 

    private ArrayList<String> names = new ArrayList<>(); 

    FoodDB Db = null; 
    int deleteId; 


    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_todaylist); 
    ListView lv = (ListView) findViewById(R.id.today_meal_list); 

    Bundle a = this.getIntent().getExtras(); 

    String[] id = a.getStringArray("idArray"); //used to delete 
    String[] mealNames = a.getStringArray("mealNamesArray"); //displayed 

    Collections.addAll(names, mealNames); 

    //call the list adapter to create views based off the array list 'names' 
    lv.setAdapter(new MyListAdapter(this, R.layout.list_item, names)); 
} 

    protected class MyListAdapter extends ArrayAdapter<String> { 
    private int layout; 

    private MyListAdapter(Context context, int resource, List<String> objects) { 
     super(context, resource, objects); 
     layout = resource; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     viewHolder viewholder; 
     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      viewholder = new viewHolder(); 
      viewholder.title = (TextView) convertView.findViewById(R.id.report_meal_name); 
      viewholder.delButton = (Button) convertView.findViewById(R.id.button_delete_meal); 
      viewholder.delButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int position = (Integer)v.getTag(); 
        //int deleteId derived from id[position] 
        deleteId = Integer.parseInt(id[position]); 
        idToDelete(deleteId); 
        //update the list view to exclude the deleted item 
        names.remove(position); 
        notifyDataSetChanged(); 
       } 
      }); 

      convertView.setTag(viewholder); 
     } else { 
      viewholder = (viewHolder) convertView.getTag(); 
     } 
     //set string value for title 
     viewholder.title.setText(getItem(position)); 
     viewholder.delButton.setTag(position); 
     return convertView; 



    } 
} 
public class viewHolder { 
    TextView title; 
    TextView delButton; 
} 
//delete from database 
public void idToDelete(int DeleteId){ 
    Db.deleteFoods(deleteId); 
} 

}

方法や場所(IDアレイがある活動に)リストビューから位置指標のいずれかを取得したり、内部IDアレイへのアクセスを取得するためになど任意の提案リストビューは高く評価されるだろう!

答えて

0

アレイをMyListAdapterアダプタに渡すには、このクラスのコンストラクタをパラメータとして受け入れるように変更します。また、すでにnamesリストをパラメータとして渡しているので、ボタンを押したときにアクセスできるように、その参照を保持する必要があります。ここで

は一例です:

protected class MyListAdapter extends ArrayAdapter<String> { 
    private int layout; 
    private List<String> names; 
    private String[] ids; 

    private MyListAdapter(Context context, int resource, List<String> names, String[] ids) { 
     super(context, resource, names); 
     layout = resource; 
     this.names = names; 
     this.ids = ids; 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ... 
     viewholder.delButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int deleteId = Integer.parseInt(ids[position]);// the "position" variable needs to be set to "final" in order to access it in here. 
       idToDelete(deleteId); 
       names.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     .... 
    } 
} 

、ここでは、このアダプタのインスタンスを作成する方法です。

lv.setAdapter(new MyListAdapter(this, R.layout.list_item, names, id)); 
+0

ブリリアント!ありがとうございました。私は引数を追加しようとしましたが、クラスに追加することは私には起こりませんでした。乾杯! – quixo

関連する問題