Android-доступ к элементам из пользовательского списка - PullRequest
0 голосов
/ 10 декабря 2010

Заголовок этого вопроса может быть плохим, но трудно было придумать заглавие. Так вот в чем вопрос.

У меня есть приложение, которое открывает базу данных и создает собственный 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, но, похоже, именно так все рекомендуют создавать собственные ListViews.

Как получить данные из ListView? Например, часть строки является флажком. Если пользователь нажимает флажок, чтобы активировать / деактивировать конкретную строку, как мне уведомить об этом основное приложение?

Спасибо

РЕДАКТИРОВАТЬ:

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);
    }
}

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Как получить данные из ListView?

Если вы хотите узнать, какой элемент в ListView был выбран, используйте OnItemClickListener и Listview.setOnItemClickListener. Пример этого есть в учебнике Hello ListView .

Как только вы узнаете, какой предмет выбран, вы узнаете положение этого предмета в общем Adapter и получите View. Вы можете использовать представление, чтобы получить подэлементы, если это необходимо, как правило, хотя позиции достаточно, чтобы вы знали, какая часть вашей «модели» была нажата. В вашем примере он скажет вам точно, какой элемент в вашем List<MyClass> был нажат.

Если вы хотите различать элемент списка, по которому щелкают, и фокусируемое представление в элементе списка (например, флажок), тогда это немного сложнее. Флажок по умолчанию перенаправит фокус с элемента списка. Вы можете переключить это и сделать это ложным, в зависимости от того, что вы пытаетесь сделать. См. этот вопрос для получения дополнительной информации.

Если вам необходимо различать щелчок элемента ListView и щелчок CheckBox, существует несколько способов. Один из способов - просто поддерживать состояние того, был ли элемент нажат в адаптере.

Например:

MovieAdapter

MyMovies (ListView)

Тогда вы просто используете обычный «onListItemClick» и адаптер, чтобы сказать, что нажимается, а что нет. (Это всего лишь один из способов сделать это, их несколько.)

0 голосов
/ 10 декабря 2010

То есть у вас есть собственный cursoradapter, который создает представления?Когда вы создаете представление в getView(), просто настройте прослушиватель в этом представлении для прослушивания того, что вы хотите.Возможно, на клик

...