按钮,不要在适配器的recyclerview中单击

时间:2019-02-26 13:40:38

标签: android

我制作了一个用户名和呼叫按钮的列表,每个用户名旁边都有一个呼叫按钮,当我单击呼叫按钮时,呼叫按钮中的代码并未在所有单击中得到执行,因此我尝试制作整个项目可单击的,因此,如果用户单击按钮,用户名或layout_item中的任何部分,则代码将被执行,但未发生任何更改。 这是我实现适配器的方式:

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View mView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.freind_list_item, parent,false);
    return new MyViewHolder(mView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

    Friend friend = friends.get(position);
    holder.btnInitCallHandler(friend.getUsername(), friend.get_id());
    holder.setUsername(friend.getUsername());
}

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView txtUsername;
    Button btnInitCallWithFriend;
    RelativeLayout rlInsteadOfButtonHandler;

    MyViewHolder(View itemView) {
        super(itemView);
        txtUsername = itemView.findViewById(R.id.txt_friend_item);
        btnInitCallWithFriend = itemView.findViewById(R.id.btnInitCallWithFriendNormal);
        friendState = itemView.findViewById(R.id.onlineState);
        signedAsGlasses = itemView.findViewById(R.id.signedInAsGlasses);
        signedAsLaptop = itemView.findViewById(R.id.signedInAsLaptop);
        rlInsteadOfButtonHandler = itemView.findViewById(R.id.rlInsteadButtonHandler);
    }
    void setUsername(String username) {
        txtUsername.setText(username);
    }


    void btnInitCallHandler(String username, String userId) {
        btnInitCallWithFriend.setOnClickListener((view) -> {
            Timber.tag("KingArmstringNormalUserCall").d("normal user call button clicked from the adapter");
            viewAccessor.initCall(username, userId);
        });

        rlInsteadOfButtonHandler.setOnClickListener((v) -> {
            viewAccessor.initCall(username, userId);
        });
    }
}

viewAccessor只是活动所实现的接口,并且只有一个方法(initCall) 活动中的initCall(username,userId)只有一个吐司和一个日志

编辑:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:background="@android:color/black"
android:padding="10dp">

<TextView
    android:id="@+id/txt_friend_item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txt_friend_name_placeholder"
    android:textSize="30sp"
    android:layout_gravity="center"
    android:gravity="center"
    android:textColor="@color/colorAccent"/>
<RelativeLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

<RelativeLayout
    android:id="@+id/rlInsteadButtonHandler"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1">
    <!--<at.markushi.ui.CircleButton-->
        <!--android:id="@+id/btnInitCallWithFriend"-->
        <!--android:layout_width="70dp"-->
        <!--android:layout_height="40dp"-->
        <!--android:src="@drawable/ic_video_call"-->
        <!--android:layout_marginStart="10dp"-->
        <!--android:layout_gravity="center"-->
        <!--android:focusable="false"-->
        <!--android:focusableInTouchMode="false"-->
        <!--app:cb_color="#fff"-->
        <!--android:layout_alignParentEnd="true"/>-->

    <Button
        android:id="@+id/btnInitCallWithFriendNormal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="center"
        android:layout_marginStart="10dp"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:focusable="true"
        android:text="call" />

</RelativeLayout>

4 个答案:

答案 0 :(得分:2)

我终于弄清楚了发生了什么,我已经在前台处理了很多事情,我已经将它们转移到其他线程上了,现在它起作用了,您可能不相信我,但是许多真正有经验的人说对我来说,他们遇到了非常相似的情况。

答案 1 :(得分:1)

在MyViewHolder类的构造函数上使用以下代码。此代码使项目可点击。

itemView.setClickable(true);

还要在MyViewHolder类上设置onClickLiester。然后使用getAdapterPostion()方法确定单击了哪个项目。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataList.get(getAdapterPosition()); //this code will return the clicked item object.
        });

答案 2 :(得分:1)

首先从btnInitCallHandler()中删除ViewHolder函数,然后直接在viewHolder中设置clickListener,您可以通过调用getAdapterPosition()作为示例来从列表中获取当前项目:

btnInitCallWithFriend.setOnClickListener((view) -> {
            Timber.tag("KingArmstringNormalUserCall").d("normal user call button clicked from the adapter");
            viewAccessor.initCall(friends.get(getAdapterPosition).getUsername(), friends.get(getAdapterPosition).get_id());
        });

这就是您的新适配器类:

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View mView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.freind_list_item, parent,false);
    return new MyViewHolder(mView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

    //do your stuff
}

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView txtUsername;
    Button btnInitCallWithFriend;
    RelativeLayout rlInsteadOfButtonHandler;

    MyViewHolder(View itemView) {
        super(itemView);
        txtUsername = itemView.findViewById(R.id.txt_friend_item);
        btnInitCallWithFriend = itemView.findViewById(R.id.btnInitCallWithFriendNormal);
        friendState = itemView.findViewById(R.id.onlineState);
        signedAsGlasses = itemView.findViewById(R.id.signedInAsGlasses);
        signedAsLaptop = itemView.findViewById(R.id.signedInAsLaptop);
        rlInsteadOfButtonHandler = itemView.findViewById(R.id.rlInsteadButtonHandler);

        btnInitCallWithFriend.setOnClickListener((view) -> {
            Timber.tag("KingArmstringNormalUserCall").d("normal user call button clicked from the adapter");
            viewAccessor.initCall(friends.get(getAdapterPosition).getUsername(), friends.get(getAdapterPosition).get_id());
        });

        rlInsteadOfButtonHandler.setOnClickListener((v) -> {
            viewAccessor.initCall(friends.get(getAdapterPosition).getUsername(), friends.get(getAdapterPosition).get_id());
        });
    }
    void setUsername(String username) {
        txtUsername.setText(username);
    }
}

答案 3 :(得分:1)

以下是RecylcerView的简单而强大的实现。尝试阅读回收者视图的基础知识以及为什么使用viewholder。希望这对您有所帮助。

public class TestActivity extends Activity implements TestAdapter.ItemClickListener {

TestAdapter adapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_layout);

    ArrayList<String> testNames = new ArrayList<>();
    testNames.add("Horse");
    testNames.add("Cow");
    testNames.add("Camel");
    testNames.add("Sheep");
    testNames.add("Goat");

    RecyclerView recyclerView = findViewById(R.id.testList);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new TestAdapter(this, testNames);
    adapter.setClickListener(this);
    recyclerView.setAdapter(adapter);

}

@Override
public void onItemClick(View view, int position) {
    Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
}}

以下是适配器类的实现

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyViewHolder> {
private ItemClickListener mClickListener;
private List<String> mData;
private Activity mActivity;

public TestAdapter(TestActivity testActivity, ArrayList<String> testNames) {
    this.mData = testNames;
    this.mActivity = testActivity;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View mView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.test_row, parent, false);
    return new MyViewHolder(mView);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    String animal = mData.get(position);
    holder.txtUsername.setText(animal);
}

@Override
public int getItemCount() {
    return mData.size();
}

public String getItem(int position) {
    return mData.get(position);
}

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView txtUsername;
    Button btnInitCallWithFriend;

    MyViewHolder(View itemView) {
        super(itemView);
        txtUsername = itemView.findViewById(R.id.txt_friend_item);
        btnInitCallWithFriend = itemView.findViewById(R.id.btnInitCallWithFriendNormal);
        //friendState = itemView.findViewById(R.id.onlineState);
        //signedAsGlasses = itemView.findViewById(R.id.signedInAsGlasses);
        //signedAsLaptop = itemView.findViewById(R.id.signedInAsLaptop);

        btnInitCallWithFriend.setOnClickListener((View view) -> {
            Toast.makeText(mActivity, "You clicked call " + getAdapterPosition() + " position", Toast.LENGTH_SHORT).show();
        });

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mClickListener != null) {
                    mClickListener.onItemClick(itemView, getAdapterPosition());
                }
            }
        });
    }
}

// allows clicks events to be caught
void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}}