この質問のタイトルは貧弱かもしれませんが、タイトルを釘付けにするのは難しかったです。だからここに質問がある。Androidカスタムリストから要素にアクセスする
データベースを開き、その内容に基づいてカスタムのListViewを作成するアプリケーションがあります。したがって、このプロセスに関係するいくつかのファイルがあります:
Main.java - opens the database and stores the List<MyClass> of contents
main.xml - main activity layout with the ListView
MyAdapter.java - extends BaseAdapter and calls MyAdapterView based on the context
MyAdapaterView.java - inflates the View from MyAdapater based on row.xml
row.xml - layout of each custom row of the ListView
これは問題なく動作します。私はAndroidには新しいですが、構造的には、これは皆がカスタムListViewを構築することをどのように推奨するかのようです。
リストビューからデータを取得するにはどうすればよいですか?たとえば、行の一部がチェックボックスです。ユーザーがチェックボックスを押して特定の行をアクティブ/非アクティブにすると、そのことについてメインアプリケーションにどのように通知するのですか?
おかげで、
EDIT:
Main.java
public class MyApplication extends Activity
implements OnItemClickListener, OnItemLongClickListener
{
private List<MyClass> objects;
private ListView lvObjects;
private MyAdapter myAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
objects = new ArrayList<MyClass>(); // setup the list
lvObjects = (ListView)findViewById(R.id.lvObjectList);
lvObjects.setOnItemClickListener(this);
lvObjects.setOnItemLongClickListener(this);
loadDatabase(DATABASE);
myAdapter = new MyAdapter(this, objects);
lvObjects.setAdapter(myAdapter);
}
...
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
// This is executed when an item in the ListView is short pressed
}
public void onItemLongClick(AdapterView<?> parent, View v, int position, long id)
{
// This is executed when an item in the ListView is long pressed
registerForContextMenu(lvObjects);
v.showContextMenu();
}
MyAdapter.java
public class MyAdapter extends BaseAdapter
{
private Context context;
private List<MyClass> list;
public RuleAdapter(Context context, List<MyClass> list)
{
this.context = context;
this.list = list;
}
...
public View getView(int position, View view, ViewGroup viewGroup)
{
MyClass entry = list.get(position);
return new MyAdapterView(context,entry);
}
}
MyAdapterView.java
public class MyAdapterView extends LinearLayout
{
public MyAdapterView(Context context, MyClass entry)
{
super(context);
this.setOrientation(VERTICAL);
this.setTag(entry);
View v = inflate(context, R.layout.row, null);
// Set fields based on entry object
// When this box is checked or unchecked, a message needs to go
// back to Main.java so the database can be updated
CheckBox cbActive = (CheckBox)v.findViewById(R.id.cbActive);
addView(v);
}
}
右、CheckBoxはListViewの行のフォーカスをとるので、XMLファイルでは、CheckBoxを 'android:focusable =" false "'に設定しました。これは動作し、ListViewの短く長いクリックを聞くことができます。しかし、今、どのようにチェックボックスと行の両方を聞くのですか?行が押されると、適切に機能するContextMenuがポップアップします。しかし、CheckBoxがチェックされている場合とチェックされていない場合は、データベースを更新するためにアプリケーションにメッセージを送り返す必要があります。 'onClickListener'をアクティブにしないとどうすればいいですか? – linsek
私は最近取り組んできた1つの例で答えを更新しました。私はそれがあなたが求めているものであるかどうかは確かではありませんが、それはlistviewのチェックボックスを使用しています。 –
@Charlie - 主なアプリケーションで投稿を更新しました。私はあなたが参照した例を見ていましたが、私はそれが私が探しているものであることは完全にはわかりません。問題は3つの異なるプロセスが必要だということです。 1- ListView行が短く押されたときに、何らかの実行を行います。 2- ListView行を長押しすると、コンテキストメニューが表示されます。 3行のCheckBoxがチェックされているかチェックされていない場合は、このオブジェクトがアクティブになるか、非アクティブになるかをデータベースで更新します。私はすでに最初の2つを満たすためにonItemClickとonItemLongClickを実装しています。 – linsek