2010-12-10 19 views
0

この質問のタイトルは貧弱かもしれませんが、タイトルを釘付けにするのは難しかったです。だからここに質問がある。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); 
    } 
} 

答えて

1

ListViewからデータを取得するにはどうすればよいですか?

あなたがクリックされたListView内のどの項目を知りたい場合は、OnItemClickListenerListview.setOnItemClickListenerを使用しています。この例はHello ListViewチュートリアルにあります。

どのアイテムが選択されているかがわかると、そのアイテムの位置は全体でAdapterで、Viewになります。必要に応じてビューを使用してサブ要素を取得することができますが、一般的には、モデルのどの部分がクリックされたかを示すのに十分です。あなたの例では、あなたのList<MyClass>のどのアイテムがクリックされたかを正確に教えてくれるでしょう。

クリックしたリストアイテムとリストアイテムのフォーカス可能なビュー(チ​​ェックボックスなど)を区別したい場合は、もう少し複雑です。チェックボックスは、デフォルトでは、リスト項目からフォーカスを移動します。あなたは何をしようとしているかに応じてこれを切り替えて、それを偽にすることができます。詳細はthis questionを参照してください。

ListViewアイテムのクリックとCheckBoxのクリックを区別する必要がある場合は、いくつかの方法があります。 1つの方法は、アイテムがアダプタ内でクリックされたかどうかの状態を維持することです。例えば

MovieAdapter

MyMovies (ListView)

次に、あなただけのものをクリックすると、何ではないに伝えるために、通常の "onListItemClick" とアダプタを使用しています。 (これはこれを行う単なる方法ですが、いくつかあります)

+0

右、CheckBoxはListViewの行のフォーカスをとるので、XMLファイルでは、CheckBoxを 'android:focusable =" false "'に設定しました。これは動作し、ListViewの短く長いクリックを聞くことができます。しかし、今、どのようにチェックボックスと行の両方を聞くのですか?行が押されると、適切に機能するContextMenuがポップアップします。しかし、CheckBoxがチェックされている場合とチェックされていない場合は、データベースを更新するためにアプリケーションにメッセージを送り返す必要があります。 'onClickListener'をアクティブにしないとどうすればいいですか? – linsek

+0

私は最近取り組んできた1つの例で答えを更新しました。私はそれがあなたが求めているものであるかどうかは確かではありませんが、それはlistviewのチェックボックスを使用しています。 –

+0

@Charlie - 主なアプリケーションで投稿を更新しました。私はあなたが参照した例を見ていましたが、私はそれが私が探しているものであることは完全にはわかりません。問題は3つの異なるプロセスが必要だということです。 1- ListView行が短く押されたときに、何らかの実行を行います。 2- ListView行を長押しすると、コンテキストメニューが表示されます。 3行のCheckBoxがチェックされているかチェックされていない場合は、このオブジェクトがアクティブになるか、非アクティブになるかをデータベースで更新します。私はすでに最初の2つを満たすためにonItemClickとonItemLongClickを実装しています。 – linsek

0

ビューを作成するカスタムカーソルアダプターがありますか? getView()でビューを作成するときは、そのビューにリスナーを設定して、必要なものを聞くだけです。おそらくonClick

+0

いいえ、それはCursorAdapterではありません。 getView()でリスナーを設定する方法を説明できますか?私は私のアダプターとAdapterViewを含むように投稿を編集しました。ありがとう – linsek

関連する問題