Java 如何在android的Recyclerview中添加like按钮

Java 如何在android的Recyclerview中添加like按钮,java,android,mysql,android-recyclerview,android-volley,Java,Android,Mysql,Android Recyclerview,Android Volley,我是一个新的应用程序开发android应用程序,需要一些帮助。 我需要知道如何在链接到数据库(Mysql)的内部(Recyclerview)添加like按钮,并通过一个截取库连接以保存所有用户喜欢的内容。然后看看每个主题有多少喜欢的内容。 图中的一个例子。。 我需要添加到这个附加项目 主要活动 public class MainActivity extends AppCompatActivity { List<RecyclerViewData> recyclerViewDa

我是一个新的应用程序开发android应用程序,需要一些帮助。 我需要知道如何在链接到数据库(Mysql)的内部(Recyclerview)添加like按钮,并通过一个截取库连接以保存所有用户喜欢的内容。然后看看每个主题有多少喜欢的内容。 图中的一个例子。。

我需要添加到这个附加项目

主要活动

public class MainActivity extends AppCompatActivity {
    List<RecyclerViewData> recyclerViewDataList;
    RecyclerView recyclerView;
    private RVAdapter rvAdapter;
    private static final String TAG="apple";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setTitle("Employee List");

        recyclerViewDataList=new ArrayList<>();

        recyclerView=findViewById(R.id.recyclerView);

        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        MakeVolleyConnection();

    }

    private void MakeVolleyConnection() {
        recyclerViewDataList = new ArrayList<>();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
                "http://10.0.13.45/v/parsing.php", null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {

                    JSONArray dataArray = response.getJSONArray("data");
                    for (int i = 0; i < dataArray.length(); i++) {
                        JSONObject userData = dataArray.getJSONObject(i);
                        RecyclerViewData recyclerViewData = new RecyclerViewData();
                        recyclerViewData.setId(userData.getInt("id"));
                        recyclerViewData.setFirstname(userData.getString("first_name"));
                        recyclerViewData.setLastname(userData.getString("last_name"));
                        recyclerViewData.setAvatar(userData.getString("avatar"));
                        recyclerViewDataList.add(recyclerViewData);

                    }
                    rvAdapter = new RVAdapter(recyclerViewDataList, MainActivity.this);
                    recyclerView.setAdapter(rvAdapter);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(MainActivity.this, ""+error.networkResponse,Toast.LENGTH_SHORT).show();
            }
        });

        MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);
    }
}

右旋适配器

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVHOLDER> {
    List<RecyclerViewData> recyclerViewDataList;
    Context mContext;

    // Constructor with List and Context which we'll pass from RecyclerView Activity after a connection to Volley. And application context for the listener that we'll implement this later.
    public RVAdapter(List<RecyclerViewData> recyclerViewDataList, Context mContext) {
        this.recyclerViewDataList = recyclerViewDataList;
        this.mContext = mContext;
    }

    // Override the method onCreateViewHolder, which will call the custom view holder that needs to be initialized. We specify the layout that each item to be used, so we can achieve this using Layout Inflator to inflate the layout and passing the output to constructor of custom ViewHolder.
    @NonNull
    @Override
    public RVHOLDER onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(mContext).inflate(R.layout.adapter_layout, viewGroup, false);
        RVHOLDER rvholder = new RVHOLDER(itemView);
        return rvholder;
    }


    //onBindViewHolder is for specifying the each item of RecyclerView. This is very similar to getView() method on ListView. In our example, this is where you need to set the user's id, name and image.
    @Override
    public void onBindViewHolder(@NonNull RVHOLDER rvholder, int i) {
        rvholder.id.setText("User id is "+recyclerViewDataList.get(i).getId());
        rvholder.first_name.setText(recyclerViewDataList.get(i).getFirstname() + " " + recyclerViewDataList.get(i).getLastname());
        Picasso.get().load(recyclerViewDataList.get(i).getAvatar()).into(rvholder.avatar);
    }

    //We need to return the size for RecyclerView as how long a RecyclerView is, Our data is in list so passing data.size() will return the number as long as we have.
    @Override
    public int getItemCount() {
        return recyclerViewDataList.size();
    }

    //This is CustomView holder that we had discuss it earlier above and inflated it in onCreateView() method. This constructor links with the xml to set the data, which we set into onBindViewHolder().
    class RVHOLDER extends RecyclerView.ViewHolder {
        TextView id;
        private TextView first_name;
        private ImageView avatar;

        public RVHOLDER(@NonNull View itemView) {
            super(itemView);
            id = itemView.findViewById(R.id.id);
            first_name = itemView.findViewById(R.id.firstname_lastname);
            avatar = itemView.findViewById(R.id.avatar);
        }
    }
}

公共类RVAdapter扩展了RecyclerView.Adapter{ 列出RecyclerViewCatalist; 语境; //构造函数的列表和上下文,我们将在连接到Volley之后从RecyclerView活动中传递,并为侦听器传递应用程序上下文,稍后我们将实现它。 公共RVAdapter(列表recyclerViewDataList,上下文mContext){ this.recyclerViewDataList=recyclerViewDataList; this.mContext=mContext; } //重写onCreateViewHolder方法,该方法将调用需要初始化的自定义视图holder。我们指定每个项要使用的布局,因此可以使用布局充气器充气布局并将输出传递给自定义ViewHolder的构造函数来实现这一点。 @非空 @凌驾 public RVHOLDER onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){ View itemView=LayoutFlater.from(mContext).充气(R.layout.adapter\u布局,视图组,false); RVHOLDER RVHOLDER=新RVHOLDER(项目视图); 返回持票人; } //onBindViewHolder用于指定RecyclerView的每个项。这与ListView上的getView()方法非常相似。在我们的示例中,这是您需要设置用户id、名称和图像的地方。 @凌驾 BindViewHolder上的公共无效(@NonNull RVHOLDER,int i){ rvholder.id.setText(“用户id为”+RecycleServiceWdata.get(i.getId()); rvholder.first_name.setText(recyclerViewDataList.get(i).getFirstname()+“”+recyclerViewDataList.get(i).getLastname()); Picasso.get().load(recycleServiceWdatalist.get(i.getAvatar()).into(rvholder.avatar); } //我们需要返回RecyclerView的大小作为RecyclerView的长度,我们的数据在列表中,因此传递data.size()将返回我们拥有的长度。 @凌驾 public int getItemCount(){ 返回recyclerViewDataList.size(); } //这是我们前面讨论过的CustomView holder,并在onCreateView()方法中对其进行了扩展。此构造函数与xml链接以设置数据,我们将其设置为onBindViewHolder()。 类RVHOLDER扩展了RecyclerView.ViewHolder{ 文本视图id; 私有文本视图第一个名称; 私有图像视图化身; 公共RVHOLDER(@NonNull View itemView){ 超级(项目视图); id=itemView.findviewbyd(R.id.id); first\u name=itemView.findviewbyd(R.id.firstname\u lastname); avatar=itemView.findviewbyd(R.id.avatar); } } }


在RecyclerViewData类中添加like布尔变量。添加它的getter和setter。在drawable文件夹中为Like和Not_Like添加两个drawable。然后添加这个逻辑。希望这会有所帮助。谢谢


你好,兄弟,谢谢你的回复,但我不明白我需要做的一切。你能发完整的代码吗?兄弟,把这类数据插入数据库的截取代码怎么样?兄弟,把这类数据插入数据库的截取代码怎么样?

public class RecyclerViewData {
    private int id;
    private String firstname;
    private String lastname;
    private String avatar;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
}

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVHOLDER> {
    List<RecyclerViewData> recyclerViewDataList;
    Context mContext;

    // Constructor with List and Context which we'll pass from RecyclerView Activity after a connection to Volley. And application context for the listener that we'll implement this later.
    public RVAdapter(List<RecyclerViewData> recyclerViewDataList, Context mContext) {
        this.recyclerViewDataList = recyclerViewDataList;
        this.mContext = mContext;
    }

    // Override the method onCreateViewHolder, which will call the custom view holder that needs to be initialized. We specify the layout that each item to be used, so we can achieve this using Layout Inflator to inflate the layout and passing the output to constructor of custom ViewHolder.
    @NonNull
    @Override
    public RVHOLDER onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(mContext).inflate(R.layout.adapter_layout, viewGroup, false);
        RVHOLDER rvholder = new RVHOLDER(itemView);
        return rvholder;
    }


    //onBindViewHolder is for specifying the each item of RecyclerView. This is very similar to getView() method on ListView. In our example, this is where you need to set the user's id, name and image.
    @Override
    public void onBindViewHolder(@NonNull RVHOLDER rvholder, int i) {
        rvholder.id.setText("User id is "+recyclerViewDataList.get(i).getId());
        rvholder.first_name.setText(recyclerViewDataList.get(i).getFirstname() + " " + recyclerViewDataList.get(i).getLastname());
        Picasso.get().load(recyclerViewDataList.get(i).getAvatar()).into(rvholder.avatar);
    }

    //We need to return the size for RecyclerView as how long a RecyclerView is, Our data is in list so passing data.size() will return the number as long as we have.
    @Override
    public int getItemCount() {
        return recyclerViewDataList.size();
    }

    //This is CustomView holder that we had discuss it earlier above and inflated it in onCreateView() method. This constructor links with the xml to set the data, which we set into onBindViewHolder().
    class RVHOLDER extends RecyclerView.ViewHolder {
        TextView id;
        private TextView first_name;
        private ImageView avatar;

        public RVHOLDER(@NonNull View itemView) {
            super(itemView);
            id = itemView.findViewById(R.id.id);
            first_name = itemView.findViewById(R.id.firstname_lastname);
            avatar = itemView.findViewById(R.id.avatar);
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        card_view:cardCornerRadius="4dp"
        card_view:cardUseCompatPadding="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/avatar"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginRight="16dp"
                android:scaleType="fitCenter" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/firstname_lastname"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceMedium" />

                <TextView
                    android:id="@+id/id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </LinearLayout>
        </LinearLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

<?php

$con=mysqli_connect("localhost","root","root","test");

$sql="SELECT * FROM testtable";

$result=mysqli_query($con,$sql);

$data=array();
while($row=mysqli_fetch_assoc($result)){
$data["data"][]=$row;
}
        header('Content-Type:Application/json');    
    echo json_encode($data);



    ?>

 @Override
    public void onBindViewHolder(@NonNull RVHOLDER rvholder, int i) {
        rvholder.id.setText("User id is "+recyclerViewDataList.get(i).getId());
        rvholder.first_name.setText(recyclerViewDataList.get(i).getFirstname() + " " +
                recyclerViewDataList.get(i).getLastname());
        Picasso.get().load(recyclerViewDataList.get(i).getAvatar()).into(rvholder.avatar);
        if()
    }
    if (recyclerViewDataList.get(i).getLiked()) {
        // liked image
        Picasso.get().load(gContextCompat.getDrawable(getActivity(), R.drawable.liked);).into(rvholder.like);
    } else {
        // without like image
        Picasso.get().load(gContextCompat.getDrawable(getActivity(), R.drawable.not_like);).into(rvholder.like);
    }
    @Override
        public void onBindViewHolder(@NonNull RVHOLDER rvholder, int i) {
            rvholder.id.setText("User id is "+recyclerViewDataList.get(i).getId());
            rvholder.first_name.setText(recyclerViewDataList.get(i).getFirstname() + " " + recyclerViewDataList.get(i).getLastname());
            Picasso.get().load(recyclerViewDataList.get(i).getAvatar()).into(rvholder.avatar);


 Picasso.get().load(gContextCompat.getDrawable(getActivity(), if(recyclerViewDataList.get(i).getLiked())R.drawable.liked else R.drawable.not_like).into(rvholder.like);


}