Как добавить OnClick() для кнопок в ListView Android?

Это мое приложение. При нажатии на новую кнопку будут отображаться вопросы один за другим, и если мы нажимаем на опции (A,B,C,D), я должен отображать правильный или неправильный. Для вопросов, которые я сделал, кодирование теперь предлагает мне варианты,

У меня есть 5textviews и 4 кнопки в файле xml, данные для них заполняются из базы данных, поэтому я использовал ListView и SimpleCursorAdapter. Все работает нормально. Теперь я хочу написать функции OnClick для кнопок, которые находятся в файле XML. Я не могу добавить SetOnClickListener, поскольку он отображает ошибку "Не удалось настроить идентификатор ресурса", он отображается, когда кнопки доступны в другом xml. Как назначить OnClick() для этих кнопок?

SQLiteDatabase db;
Cursor c1;
Button b1;
String from[] = {"_id", "optn1", "optn2", "optn3", "optn4", "ab"};
int[] to = {R.id.textView3, R.id.textView5, R.id.textView6, R.id.textView7, R.id.textView8, R.id.textView10};
int i = 0;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    db.execSQL("CREATE TABLE ques(_id TEXT,optn1 TEXT ,optn2 TEXT,optn3 TEXT,optn4 TEXT,qno INTEGER,ab INTEGER)");
    t1 = (TextView) findViewById(R.id.textView4);
    t2 = (TextView) findViewById(R.id.textView9);
    b1 = (Button) findViewById(R.id.button);
    b1.setOnClickListener(this);
}

public void onClick(View v) {//this onclick is to display the texts only if the button is clicked not as soon as the app is executed
    if (v == b1) {
        db = openOrCreateDatabase("quiz1.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
        if (c1 != null) {
            i = c1.getInt(c1.getColumnIndex("qno"));
        }
        c1 = db.rawQuery("SELECT * FROM ques WHERE qno>'" + i + "' ORDER BY qno LIMIT 1", null);
        SimpleCursorAdapter sca = new SimpleCursorAdapter(MainActivity.this, R.layout.compo_list, c1, from, to);
        ListView l1 = (ListView) findViewById(R.id.listView);
        l1.setAdapter(sca);
        sca.changeCursor(c1);
        t1.setText(String.valueOf(i));
    }
}
  Layout.XML
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView3"
        android:text="QUESTION"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="44dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView5"
        android:layout_marginTop="46dp"
        android:phoneNumber="false"
        android:gravity="center"
        android:layout_below="@+id/textView3"
        android:layout_centerHorizontal="true" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A"
        android:id="@+id/button2"
        android:layout_alignTop="@+id/textView5"
        android:layout_toLeftOf="@+id/textView5"
        android:layout_toStartOf="@+id/textView5" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView6"
        android:layout_below="@+id/button2"
        android:layout_toRightOf="@+id/button2"
        android:layout_toEndOf="@+id/button2"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B"
        android:id="@+id/button3"
        android:layout_below="@+id/button2"
        android:layout_alignLeft="@+id/button2"
        android:layout_alignStart="@+id/button2"
        android:layout_alignRight="@+id/button2"
        android:layout_alignEnd="@+id/button2"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView7"
        android:layout_below="@+id/button3"
        android:layout_alignLeft="@+id/textView6"
        android:layout_alignStart="@+id/textView6"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="C"
        android:id="@+id/button4"
        android:layout_alignTop="@+id/textView7"
        android:layout_alignLeft="@+id/button3"
        android:layout_alignStart="@+id/button3" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView8"
        android:layout_below="@+id/button4"
        android:layout_toRightOf="@+id/button4"
        android:layout_toEndOf="@+id/button4"
        android:gravity="center" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="D"
        android:id="@+id/button5"
        android:layout_alignTop="@+id/textView8"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignStart="@+id/button4" />

жду предложения. Буду очень признателен, если вы мне поможете. Спасибо заранее.

4 ответа

Решение

Поместил новое действие с именем ListViewAdapter, которое расширяет BaseAdapter и переопределяет функции в нем. Поместил все действия OnClick() внутри этого класса, и он отлично работает. Пинг мне, если кому-то нужно больше информации об этом.

Сделайте это из вашего списка.

    l1.setOnItemClickListener(new OnItemClickListener()
{
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
    { 
        Toast.makeText(getActivity(), "" + position, Toast.LENGTH_SHORT).show();
    }
});

О коде:

SimpleCursorAdapter sca = new SimpleCursorAdapter(MainActivity.this, R.layout.compo_list, c1, from, to);
ListView l1 = (ListView) findViewById(R.id.listView);

Когда вы звоните SimpleCursorAdapter с макетом XML compo_list, это не раздувает макет. Он предназначен для адаптера, а не для деятельности. Поэтому вы должны получить ошибку во время выполнения findViewById(R.id.listView)

Предложения:

  • В SimpleCursorAdapter скопируйте код findViewById для адаптера. Это обычная техника.
  • Не пытайтесь раздувать в деятельности, setContentView сделал это уже. Это сбивает с толку и много работы для этого. Обычно раздувание производится во фрагменте. Во фрагменте вы можете вызвать и создать новый экземпляр SimpleCursorAdapter.
  • Уже есть код setContentView(R.layout.activity_main) в деятельности. Обычно это ваш единственный файл макета, в который вы можете поместить элементы пользовательского интерфейса.

РЕДАКТИРОВАТЬ: согласно вашему предложению, вот хорошие учебники веб-страниц на ListView:

  1. ArrayAdapter @ Использование ArrayAdapter с ListView
  2. SimpleCursorAdapter с ListView с использованием CursorAdapters

Примечания:

  • Веб-страница 1 представляет использование ListView с популярным ARrayAdapter.
  • Страница 2 знакомит с использованием CursorAdapters, предполагает, что вы знаете, как использовать ListView и базовые адаптеры.

Фрагмент кода со страницы ссылок 1:

public View getView(int position, View convertView, ViewGroup parent) {
       // Get the data item for this position
       User user = getItem(position);    
       // Check if an existing view is being reused, otherwise inflate the view
       if (convertView == null) {

          convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false);
       }

Обратите внимание на метод inflate во фрагменте кода. Это макет, который вы хотите использовать для R.layout.compo_list,

Я надеюсь, что это помогает и объясняет вашу проблему. Кажется, у тебя еще есть работа. Удачи и приятного времяпровождения...

  listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override
  public void onItemClick(AdapterView<?> parent, final View view,
      int position, long id) {
    final String item = (String) parent.getItemAtPosition(position);
    t1.setText(String.valueOf(item));

  }

});
Другие вопросы по тегам