programing

Android:클릭 가능한 단추가 여러 개 있는 목록 보기 요소

cafebook 2023. 8. 6. 10:21
반응형

Android:클릭 가능한 단추가 여러 개 있는 목록 보기 요소

나는 있습니다.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"
        />

btn제거클릭 이벤트

public void btnRemoveClick(View v)
{
    final int position = listviewItem.getPositionForView((View) v.getParent()); 
    listItem.remove(position);
    ItemAdapter.notifyDataSetChanged();

}

방법을 찾았을 수도 있지만, 전화를 걸 수 있습니다.

ListView.setItemsCanFocus(true)

이제 당신의 단추가 초점을 맞출 것입니다.

최선의 방법인지는 모르겠지만 잘 작동하고 모든 코드가 어레이 어댑터에 남아 있습니다.

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 설계를 위반합니다.

반면, 상황에 맞는 메뉴는 수동적인 표현이 없기 때문에 최종 사용자에게 명확하지 않습니다.행동을 문서화하는 것을 고려하시겠습니까?

이 가이드는 당신에게 좋은 출발을 제공할 것입니다.

http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/

언급URL : https://stackoverflow.com/questions/1709166/android-listview-elements-with-multiple-clickable-buttons

반응형