Android : 여러 개의 클릭 가능한 버튼이있는 ListView 요소
나는했습니다 ListView
목록의 모든 요소가 텍스트 뷰와 두 개의 서로 다른 버튼을 포함하는 경우를. 이 같은:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
이 코드 OnItemClickListener
를 사용하면 전체 항목에 대해를 만들 수 있습니다 .
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
그러나 전체 항목을 클릭 할 수 있기를 원하지 않지만 각 목록 요소의 두 버튼 만 있습니다.
그래서 내 질문은 다음 매개 변수를 사용 하여이 두 버튼에 대해 onClickListener를 어떻게 구현합니까?
int button
(요소의 어느 버튼을 클릭했는지)int position
(버튼 클릭이 발생한 목록의 요소)
업데이트 : 아래 답변에 설명 된대로 해결책을 찾았습니다. 이제 터치 스크린을 통해 버튼을 클릭 / 탭할 수 있습니다. 그러나 트랙볼로는 수동으로 선택할 수 없습니다. 항상 전체 목록 항목을 선택하고에서 심지어 세트 불구하고, 버튼을 무시하고 다음 목록 항목에 직접 간다 .setFocusable(true)
과 setClickable(true)
의 버튼에 getView()
.
또한이 코드를 사용자 정의 목록 어댑터에 추가했습니다.
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
이로 인해 목록 항목을 더 이상 선택할 수 없게됩니다. 그러나 중첩 된 버튼을 선택하는 데 도움이되지 않았습니다.
아이디어가 있습니까?
이것에 대한 해결책은 실제로 생각보다 쉽습니다. getView()
사용중인 버튼에 대해 사용자 정의 어댑터의 메소드에 setOnClickListener ()를 추가하기 만하면 됩니다.
버튼과 관련된 모든 데이터는 첨가되어야 myButton.setTag()
에서 getView()
와 OnClickListener를 통해 액세스 될 수있다view.getTag()
내 블로그 에 자세한 솔루션을 자습서로 게시했습니다 .
이것은 부속 장치 @znq의 답변입니다 ...
클릭 한 항목의 행 위치를 알고 싶어하고 행의 어느 뷰가 탭되었는지 알고 싶은 경우가 많습니다. 이것은 태블릿 UI에서 훨씬 더 중요해질 것입니다.
다음 사용자 정의 어댑터를 사용하여이를 수행 할 수 있습니다.
private static class CustomCursorAdapter extends CursorAdapter {
protected ListView mListView;
protected static class RowViewHolder {
public TextView mTitle;
public TextView mText;
}
public CustomCursorAdapter(Activity activity) {
super();
mListView = activity.getListView();
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
// do what you need to do
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = View.inflate(context, R.layout.row_layout, null);
RowViewHolder holder = new RowViewHolder();
holder.mTitle = (TextView) view.findViewById(R.id.Title);
holder.mText = (TextView) view.findViewById(R.id.Text);
holder.mTitle.setOnClickListener(mOnTitleClickListener);
holder.mText.setOnClickListener(mOnTextClickListener);
view.setTag(holder);
return view;
}
private OnClickListener mOnTitleClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = mListView.getPositionForView((View) v.getParent());
Log.v(TAG, "Title clicked, row %d", position);
}
};
private OnClickListener mOnTextClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = mListView.getPositionForView((View) v.getParent());
Log.v(TAG, "Text clicked, row %d", position);
}
};
}
미래의 독자들을 위해 :
트랙볼을 사용하여 버튼을 수동으로 선택하려면 다음을 사용하십시오.
myListView.setItemsCanFocus(true);
그리고 전체 목록 항목에 대한 초점을 비활성화하려면 :
myListView.setFocusable(false);
myListView.setFocusableInTouchMode(false);
myListView.setClickable(false);
그것은 나에게 잘 작동하고 터치 스크린이있는 버튼을 클릭 할 수 있으며 키패드를 사용하여 클릭 초점을 낮출 수 있습니다
위의 사용자보다 경험이 많지 않지만이 같은 문제에 직면하여 아래 솔루션으로 해결했습니다.
<Button
android:id="@+id/btnRemove"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/btnEdit"
android:layout_weight="1"
android:background="@drawable/btn"
android:text="@string/remove"
android:onClick="btnRemoveClick"
/>
btnRemoveClick 클릭 이벤트
public void btnRemoveClick(View v)
{
final int position = listviewItem.getPositionForView((View) v.getParent());
listItem.remove(position);
ItemAdapter.notifyDataSetChanged();
}
아마 당신은 그것을하는 방법을 찾았지만 전화 할 수 있습니다
ListView.setItemsCanFocus(true)
이제 버튼이 초점을 잡을 것입니다
최선의 방법은 확실하지 않지만 잘 작동하고 모든 코드는 ArrayAdapter에 남아 있습니다.
package br.com.fontolan.pessoas.arrayadapter;
import java.util.List;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import br.com.fontolan.pessoas.R;
import br.com.fontolan.pessoas.model.Telefone;
public class TelefoneArrayAdapter extends ArrayAdapter<Telefone> {
private TelefoneArrayAdapter telefoneArrayAdapter = null;
private Context context;
private EditText tipoEditText = null;
private EditText telefoneEditText = null;
private ImageView deleteImageView = null;
public TelefoneArrayAdapter(Context context, List<Telefone> values) {
super(context, R.layout.telefone_form, values);
this.telefoneArrayAdapter = this;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.telefone_form, parent, false);
tipoEditText = (EditText) view.findViewById(R.id.telefone_form_tipo);
telefoneEditText = (EditText) view.findViewById(R.id.telefone_form_telefone);
deleteImageView = (ImageView) view.findViewById(R.id.telefone_form_delete_image);
final int i = position;
final Telefone telefone = this.getItem(position);
tipoEditText.setText(telefone.getTipo());
telefoneEditText.setText(telefone.getTelefone());
TextWatcher tipoTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
telefoneArrayAdapter.getItem(i).setTipo(s.toString());
telefoneArrayAdapter.getItem(i).setIsDirty(true);
}
};
TextWatcher telefoneTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
telefoneArrayAdapter.getItem(i).setTelefone(s.toString());
telefoneArrayAdapter.getItem(i).setIsDirty(true);
}
};
tipoEditText.addTextChangedListener(tipoTextWatcher);
telefoneEditText.addTextChangedListener(telefoneTextWatcher);
deleteImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
telefoneArrayAdapter.remove(telefone);
}
});
return view;
}
}
늦었다는 것을 알고 있지만 도움이 될 수 있습니다. 이것은 다른 클릭 동작에 대해 사용자 정의 어댑터 클래스를 작성하는 방법의 예입니다
public class CustomAdapter extends BaseAdapter {
TextView title;
Button button1,button2;
public long getItemId(int position) {
return position;
}
public int getCount() {
return mAlBasicItemsnav.size(); // size of your list array
}
public Object getItem(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.listnavsub_layout, null, false); // use sublayout which you want to inflate in your each list item
}
title = (TextView) convertView.findViewById(R.id.textViewnav); // see you have to find id by using convertView.findViewById
title.setText(mAlBasicItemsnav.get(position));
button1=(Button) convertView.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//your click action
// if you have different click action at different positions then
if(position==0)
{
//click action of 1st list item on button click
}
if(position==1)
{
//click action of 2st list item on button click
}
});
// similarly for button 2
button2=(Button) convertView.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//your click action
});
return convertView;
}
}
이 구현을위한 플랫폼 솔루션이 길게 누르면 나타나는 상황에 맞는 메뉴를 사용하지 않습니까?
질문 작성자가 상황에 맞는 메뉴를 알고 있습니까? 목록보기에 버튼을 쌓으면 성능에 영향을 미치며 UI가 복잡해지고 플랫폼에 권장되는 UI 디자인을 위반하게됩니다.
On the flipside; context menus - by nature of not having a passive representation - are not obvious to the end user. Consider documenting the behaviour?
This guide should give you a good start.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
'Programming' 카테고리의 다른 글
브라우저 뒤로 버튼 이벤트를 감지하는 방법-크로스 브라우저 (0) | 2020.05.18 |
---|---|
메모장에서 코드 포맷하기 ++ (0) | 2020.05.18 |
앱을 시작할 때 npm start와 node app.js의 차이점은 무엇입니까? (0) | 2020.05.18 |
JVM 플래그 CMSClassUnloadingEnabled는 실제로 무엇을합니까? (0) | 2020.05.18 |
다중 부품 식별자를 바인딩 할 수 없습니다 (0) | 2020.05.18 |