0

ListViewで毎回行を設定するためにカスタムアダプタを使用していListViewます。行に 2 つのビューをクリック可能にしたい、両方からのクリック イベントが必要です。に設定OnItemClickListenerしても機能しListViewません
。callLog リスト ビュー (電話のデフォルト) とまったく同じ機能が必要です。私の問題を解決してください。必要に応じて、コードをここにも貼り付けてください。

package com.example.testsmspopup;

public class CallLogActivity extends Activity {

private ArrayList<CallDetail> callDetailArrayList;
private ListView callDetailListView = null;
private CallDetailListAdapter callDetailListAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    callDetailListView = (ListView) findViewById(R.id.contactListView);
    callDetailListView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            Log.i("MyTag","calling ...........................");
            Toast.makeText(getApplicationContext(), "onItemClick is calling", Toast.LENGTH_SHORT);
        }
    });
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    callDetailArrayList = DB.getInstance(this).getAllCallDetails();
    callDetailListAdapter = new CallDetailListAdapter();
    callDetailListView.setAdapter(callDetailListAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.call_detail_activity, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    if (item.getItemId() == R.id.menu_clear_all) {
        DB.getInstance(this).deleteAllCallDetails();
    }
    return true;
}

private class CallDetailListAdapter extends ArrayAdapter<CallDetail> {
    public CallDetailListAdapter() {
        super(CallLogActivity.this, R.layout.call_log_row, callDetailArrayList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        CallDetailHolder holder = null;
        if (row == null) {
            LayoutInflater inflater = getLayoutInflater();
            row = inflater.inflate(R.layout.call_log_row, parent, false);
            holder = new CallDetailHolder(row);
            row.setTag(holder);
        } else {
            holder = (CallDetailHolder) row.getTag();
        }
        holder.populateFrom(callDetailArrayList.get(position));
        return (row);
    }
}

private class CallDetailHolder {
    private TextView nameTextView = null;
    private TextView numTextView = null;
    private TextView timeTextView = null;
    private ImageView typeImageView = null;

    public CallDetailHolder(View row) {
        nameTextView = (TextView) row.findViewById(R.id.callDetailName);
        numTextView = (TextView) row.findViewById(R.id.callDetailNumber);
        timeTextView = (TextView) row.findViewById(R.id.callDetailTime);
        typeImageView = (ImageView) row.findViewById(R.id.callDetailType);

// row.findViewById(R.id.callDetail).setOnClickListener(CallLogActivity.this); // row.findViewById(R.id.callBackBtn).setOnClickListener(CallLogActivity.this); }

    public void populateFrom(CallDetail detail) {
        String fName = DB.getInstance(CallLogActivity.this).getContact(detail.getCallNumber()).getFirstName();
        String lName = DB.getInstance(CallLogActivity.this).getContact(detail.getCallNumber()).getLastName();
        nameTextView.setText(fName + " " + lName);
        numTextView.setText(detail.getCallNumber());
        timeTextView.setText(AppUtility.parseCallTime(detail.getCallTime()));
        switch (detail.getCallType()) {
        case AppConstants.INCOMING_CALL:
            typeImageView.setImageResource(android.R.drawable.sym_call_incoming);
            break;
        case AppConstants.OUTGOING_CALL:
            typeImageView.setImageResource(android.R.drawable.sym_call_outgoing);
            break;
        case AppConstants.MISS_CALL:
            typeImageView.setImageResource(android.R.drawable.sym_call_missed);
            break;
        default:
            break;
        }
    }
}

}

4

2 に答える 2

2

onItemClick() メソッド内でトーストを表示する場合

Toast.makeText(getApplicationContext(), "onItemClick is calling", Toast.LENGTH_SHORT).show();

代わりは

Toast.makeText(getApplicationContext(), "onItemClick is calling", Toast.LENGTH_SHORT);
于 2013-01-09T13:55:19.850 に答える
1

ImageButtonリスト項目にがあります。それはfocusable、アイテム全体のクリックイベントを防ぎます。リスト項目のクリック イベントを取得するには、ImageButtonフォーカス不可として設定する必要があります。ではなくコードで行う必要があることに注意してくださいxml

このコードをコンストラクターに追加するだけで、CallDetailHolderうまく機能するはずです。

ImageButton callBackButton = (ImageButton) row.findViewById(R.id.callBackBtn);
callBackButton.setFocusable(false);
于 2013-01-09T14:13:07.250 に答える