Вопрос по логистике элемента списка из нескольких кнопок, который может использовать идентификатор элемента в БД SQLite - PullRequest
2 голосов
/ 13 февраля 2011

Так что это немного сложная ситуация, поэтому я постараюсь объяснить, что происходит, как могу.У меня есть БД sqlite, который заполняет список.Каждый элемент в списке содержит имя элемента и две кнопки.Я хочу, чтобы эти две кнопки могли использовать идентификатор строки sqlite db элемента, который они содержат, для выполнения своей цели.Поэтому мне нужно получить идентификатор элемента, но я не думаю, что использование onListItemClick(ListView l, View v, int position, long id) будет работать для меня, потому что я не нажимаю на весь элемент, а скорее на кнопки внутри него.Если я неправильно понимаю этот момент, пожалуйста, дайте мне знать.Для того, чтобы кнопки нажимались, я создал класс, который расширяет SimpleCursorAdapter, который правильно обрабатывает щелчки.Вот два рассматриваемых класса.Во-первых, listactivity, а во-вторых, пользовательский listadapter.

import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;

public class FriendRequestList extends ListActivity implements OnClickListener {

    private Button m_closeButton;
    private TagDBAdapter mDbAdapter;
    private Cursor mCursor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDbAdapter = new TagDBAdapter(this);
        mDbAdapter.open();
        this.initLayout();
        fillData();

    }

    private void initLayout() {
        setContentView(R.layout.request_list);
        m_closeButton = (Button)findViewById(R.id.request_window_close_button);
        m_closeButton.setOnClickListener(this);
    }

    private void fillData() {
        SharedPreferences prefs = this.getSharedPreferences("Prefs", MODE_WORLD_READABLE);
        String username = prefs.getString("keyUsername", "");
        RestClient.getRequests(username, this);

        mCursor = mDbAdapter.fetchAllRequests();
        startManagingCursor(mCursor);
        String[] from = new String[] {TagDBAdapter.KEY_NAME};
        int[] to = new int[] {R.id.requester};

        SimpleCursorAdapter requests = new FriendRequestListAdapter(this, R.layout.request_view, mCursor, from, to);
        this.setListAdapter(requests);
    }

    public String getRequester() {

        return null;
    }

    @Override
    public void onClick(View v) {
        SharedPreferences prefs = this.getSharedPreferences("Prefs", MODE_WORLD_READABLE);
        String username = prefs.getString("keyUsername", "");
        RestClient.getUpdates(username, this);
        Intent intent = new Intent(this, MainMenu.class);
        this.startActivity(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mDbAdapter.close();
    }

}

И класс адаптера:

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;

public class FriendRequestListAdapter extends SimpleCursorAdapter implements OnClickListener {

    private Context mContext;


    public FriendRequestListAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to) {
        super(context, layout, c, from, to);
        mContext = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        Button confirm = (Button)view.findViewById(R.id.confirm_request);
        confirm.setOnClickListener(this);
        Button deny = (Button)view.findViewById(R.id.deny_request);
        deny.setOnClickListener(this);


        return view;
    }

    @Override
    public void onClick(View v) {
        SharedPreferences prefs = mContext.getSharedPreferences("Prefs", Activity.MODE_WORLD_READABLE);
        String username = prefs.getString("keyUsername", "");

        //want to get the id here so i can do stuff with the buttons

        switch(v.getId()) {
        case R.id.confirm_request :
            String confirmState = "2";
            //these buttons both work
            break;
        case R.id.deny_request :
            String denyState = "3";
            //these buttons both work
            Log.e("TESTING", "deny");
            break;
        }
    }
}

Надеюсь, я прояснил свой вопрос достаточно ясно.Подводя итог, я не знаю, как я мог бы получить rowId элемента, в который вложена пара кнопок, потому что я никогда не использую метод onListItemClick, который, насколько я знаю, является одним из способовобычно получает идентификатор элемента.Спасибо за чтение и спасибо за ваши ответы.Пожалуйста, дайте мне знать, если есть какие-либо разъяснения, которые я могу сделать.

Ответы [ 3 ]

1 голос
/ 13 февраля 2011


Создайте свой класс с помощью implements OnClickListener

class myCustomClass implements OnClickListener {
        int rowid;
        public myCustomClass(int rowid){
            this.rowid=rowid;
        }

        @Override
        public void onClick(View v) {
            //do you code in 'rowid' will have the current row position 

        }

    }

Так что в вашей функции

getView

вы можете установить слушателявот так

  //your other codes 
 confirm.setOnClickListener(new myCustomClass(position));
  //your other codes 
 deny.setOnClickListener(new myCustomClass(position));
  //your other codes

Надеюсь, это даст вам представление.

0 голосов
/ 24 мая 2011
 public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            Button confirm = (Button)view.findViewById(R.id.confirm_request);
            confirm.setOnClickListener(this);
            view.setTag(position);
            Button deny = (Button)view.findViewById(R.id.deny_request);
            deny.setOnClickListener(this);
            view.setTag(position);
            return view;
        }

@Override
public void onClick(View v) {

      // get the position here
      Integer position = (Integer)v.getTag();

      switch(v.getId()) {
        case R.id.confirm_request :
            break;
        case R.id.deny_request :
            String denyState = "3";
            break;
        }
    }
0 голосов
/ 13 февраля 2011

вы, возможно, можете сделать это следующим образом: в вашем пользовательском адаптере метод getView

public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        //you can set view's tag here
        //and you should do the reflect on your position to your rowid
        view.setTag(customMethodForGetId(position));
        //end
        Button confirm = (Button)view.findViewById(R.id.confirm_request);
        confirm.setOnClickListener(this);
        Button deny = (Button)view.findViewById(R.id.deny_request);
        deny.setOnClickListener(this);
        return view;
    }

и в вашем событии click вы можете получить идентификатор с помощью view.getTag ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...