Android : ListView의 List 항목에서 Button에 대한 onClick 이벤트를 설정하는 방법
의 onClick
항목에서 사용하는 버튼에 대한 이벤트 를 추가하고 싶습니다 Listview
. onClick
목록 항목의 버튼에 이벤트를 제공하려면 어떻게해야합니까 ?
onClick
사용자 지정 어댑터의 getView
메서드 에서 이벤트를 설정할 수 있습니다 . http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html
링크를 확인하십시오 .
어댑터 클래스에서
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.vehicals_details_row, parent, false);
Button deleteImageView = (Button) row.findViewById(R.id.DeleteImageView);
deleteImageView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//...
}
});
}
그러나 클릭 할 수없는 문제 -listView 행을 얻을 수 있습니다 . 해결책:
- ListView를 포커스 가능하게 만들기
android:focusable="true"
- 초점을 맞출 수없는 버튼
android:focusable="false"
이 시도,
public View getView(final int position, View convertView,ViewGroup parent)
{
if(convertView == null)
{
LayoutInflater inflater = getLayoutInflater();
convertView = (LinearLayout)inflater.inflate(R.layout.YOUR_LAYOUT, null);
}
Button Button1= (Button) convertView .findViewById(R.id.BUTTON1_ID);
Button1.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// Your code that you want to execute on this button click
}
});
return convertView ;
}
도움이 될 수 있습니다 ....
getView 메소드 내부의 사용자 정의 어댑터에서 :
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do things Here
}
});
ListView에 대한 사용자 지정 어댑터를 정의했다고 가정합니다.
이 경우 onClickListener
사용자 지정 어댑터 getView()
메서드 내에서 단추에 할당 할 수 있습니다 .
이것은 많은 게시물에서 논의되었지만 여전히 다음과 같은 솔루션을 찾을 수 없었습니다.
android:focusable="false"
android:focusableInTouchMode="false"
android:focusableInTouchMode="false"
아래 솔루션은 Button, ImageButtons, ImageView, Textview와 같은 UI 구성 요소와 함께 작동합니다. LinearLayout, RelativeLayout은 목록보기 셀 내부를 클릭하고 onItemClick에도 응답합니다.
어댑터 클래스-getview () :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.my_ref_row, parent, false);
}
final Organization currentOrg = organizationlist.get(position).getOrganization();
TextView name = (TextView) view.findViewById(R.id.name);
Button btn = (Button) view.findViewById(R.id.btn_check);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
context.doSelection(currentOrg);
}
});
if(currentOrg.isSelected()){
btn.setBackgroundResource(R.drawable.sub_search_tick);
}else{
btn.setBackgroundResource(R.drawable.sub_search_tick_box);
}
}
여기에서 버튼을 클릭 한 개체를 활동으로 가져올 수 있습니다. (특히 단추가 선택 및 선택되지 않은 상태의 확인란으로 작동하도록하려는 경우) :
public void doSelection(Organization currentOrg) {
Log.e("Btn clicked ", currentOrg.getOrgName());
if (currentOrg.isSelected() == false) {
currentOrg.setSelected(true);
} else {
currentOrg.setSelected(false);
}
adapter.notifyDataSetChanged();
}
getview 메소드에서 외부에 리스너를 넣어서 뷰를 확인하십시오 .. 이것을 따르십시오. 제 경우에는 작동했습니다 .. listview의 각 행에서 edittext의 값을 늘리거나 줄이는 방법은 무엇입니까?
ArrayList 및 ArrayAdapter 용 클래스
class RequestClass {
private String Id;
private String BookingTime;
private String UserName;
private String Rating;
public RequestClass(String Id,String bookingTime,String userName,String rating){
this.Id=Id;
this.BookingTime=bookingTime;
this.UserName=userName;
this.Rating=rating;
}
public String getId(){return Id; }
public String getBookingTime(){return BookingTime; }
public String getUserName(){return UserName; }
public String getRating(){return Rating; }
}
주요 활동:
ArrayList<RequestClass> _requestList;
_requestList=new ArrayList<>();
try {
JSONObject jsonobject = new JSONObject(result);
JSONArray JO = jsonobject.getJSONArray("Record");
JSONObject object;
for (int i = 0; i < JO.length(); i++) {
object = (JSONObject) JO.get(i);
_requestList.add(new RequestClass( object.optString("playerID"),object.optString("booking_time"),
object.optString("username"),object.optString("rate") ));
}//end of for loop
RequestCustomAdapter adapter = new RequestCustomAdapter(context, R.layout.requestlayout, _requestList);
listView.setAdapter(adapter);
사용자 정의 어댑터 클래스
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* Created by wajid on 1/12/2018.
*/
class RequestCustomAdapter extends ArrayAdapter<RequestClass> {
Context mContext;
int mResource;
public RequestCustomAdapter(Context context, int resource,ArrayList<RequestClass> objects) {
super(context, resource, objects);
mContext=context;
mResource=resource;
}
public static class ViewHolder{
RelativeLayout _layout;
TextView _bookingTime;
TextView _ratingTextView;
TextView _userNameTextView;
Button acceptButton;
Button _rejectButton;
}
@NonNull
@Override
public View getView(final int position, View convertView, ViewGroup parent){
final ViewHolder holder;
if(convertView == null) {
LayoutInflater inflater=LayoutInflater.from(mContext);
convertView=inflater.inflate(mResource,parent,false);
holder=new ViewHolder();
holder._layout = convertView.findViewById(R.id.requestLayout);
holder._bookingTime = convertView.findViewById(R.id.bookingTime);
holder._userNameTextView = convertView.findViewById(R.id.userName);
holder._ratingTextView = convertView.findViewById(R.id.rating);
holder.acceptButton = convertView.findViewById(R.id.AcceptRequestButton);
holder._rejectButton = convertView.findViewById(R.id.RejectRequestButton);
holder._rejectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, holder._rejectButton.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
holder.acceptButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, holder.acceptButton.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
}
else{
holder=(ViewHolder)convertView.getTag();
}
holder._bookingTime.setText(getItem(position).getBookingTime());
if(!getItem(position).getUserName().equals("")){
holder._userNameTextView.setText(getItem(position).getUserName());
}
if(!getItem(position).getRating().equals("")){
holder._ratingTextView.setText(getItem(position).getRating());
}
return convertView;
}
}
Main xml의 ListView :
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:id="@+id/AllRequestListView">
</ListView>
목록보기 requestlayout.xml의 리소스 레이아웃 :
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/requestLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bookingTime"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/bookingTime"
android:text="Temp Name"
android:id="@+id/userName"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/userName"
android:text="No Rating"
android:id="@+id/rating"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/AcceptRequestButton"
android:focusable="false"
android:layout_below="@+id/rating"
android:text="Accept"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/RejectRequestButton"
android:layout_below="@+id/AcceptRequestButton"
android:focusable="false"
android:text="Reject"
/>
</RelativeLayout>
나는 찾다
final Button yourButton = (Button)view.findViewById(R.id.your_button);
yourButton.setFocusable(false);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...///);
can solve the problem. If you want to get some data when clicking the button, using tags is helpful. Here the button is declared final because it will be used within inner class.
FOR KOTLIN USERS
inside your getView(...) method if you try to start an activity through button onClickListener:
myButton.setOnClickListener{
val intent = Intent(this@CurrentActivity, SecondActivity::class.java)
startActivity(intent)
}
Pass the correct pointer for "this"
'development' 카테고리의 다른 글
Ruby on Rails 용 Ubuntu에 PostgreSQL 설치 (0) | 2020.10.23 |
---|---|
gem 기본 확장을 빌드하는 데 실패했습니다 — Rails 설치 (0) | 2020.10.23 |
장고 추상 모델 대 일반 상속 (0) | 2020.10.23 |
런타임시 Entity Framework 변경 연결 (0) | 2020.10.23 |
테스트 대상 X에 오류가 발생했습니다 (예기치 않은 조기 종료, 작업이 부트 스트랩을 완료하지 않음-다시 시작하지 않음) (0) | 2020.10.23 |