Java 使用自定义listview布局中的按钮增加Int值

Java 使用自定义listview布局中的按钮增加Int值,java,android,listview,button,Java,Android,Listview,Button,我最近设法制作了一个自定义的listview布局,并从listview中填充数据。 listview包含一个Like按钮和一个textview,用于存储Like的数量。然而,我似乎不知道如何在按下按钮时获取该int并将其递增,因为将在CustomAdapter中执行 数据模型: public class MessagesListDataModel { private String uid; private String msg; private String likes; private

我最近设法制作了一个自定义的listview布局,并从listview中填充数据。 listview包含一个Like按钮和一个textview,用于存储Like的数量。然而,我似乎不知道如何在按下按钮时获取该int并将其递增,因为将在CustomAdapter中执行

数据模型:

public class MessagesListDataModel {
 private String uid;
 private String msg;
 private String likes;
 private String date;
 private Button like;
 private Button reply;


public MessagesListDataModel(String uid, String msg, String date) {
    this.uid = uid;
    this.msg = msg;
    this.date = date;
    this.likes = likes;
}
public MessagesListDataModel(){

}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}
public String getLikes() {
    return likes;
}

public void setLikes(String likes) {
    this.likes = likes;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public Button getLike() {
    return like;
}

public void setLike(Button like) {
    this.like = like;
}
}
适配器:

public class MessagesListAdapter extends ArrayAdapter<MessagesListDataModel> {

private ArrayList<MessagesListDataModel> dataModels;

public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels){
    super(context,0, dataModels);
    this.dataModels = dataModels;

}

/*
 * we are overriding the getView method here - this is what defines how each
 * list item will look.
 */
public View getView(int position, View convertView, ViewGroup parent){

    MessagesListDataModel messagesListDataModel = dataModels.get(position);

    // first check to see if the view is null. if so, we have to inflate it.
    // to inflate it basically means to render, or show, the view.
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.chat_messages_layout, parent, false);
    }


        TextView uid = (TextView) convertView.findViewById(R.id.textViewUserID);
        TextView message = (TextView) convertView.findViewById(R.id.textViewMessage);
        TextView likes = (TextView) convertView.findViewById(R.id.textViewLikes);
        TextView date = (TextView) convertView.findViewById(R.id.textViewDateTime);
        Button like = (Button) convertView.findViewById(R.id.buttonLike);
        Button reply = (Button) convertView.findViewById(R.id.buttonReply);

        uid.setText(messagesListDataModel.getUid());
        message.setText(messagesListDataModel.getMsg());
        date.setText(messagesListDataModel.getDate());
        likes.setText(messagesListDataModel.getLikes());

        like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast toast = Toast.makeText(getContext(), "Like button pressed", Toast.LENGTH_SHORT);
                toast.show();
                //Increment the value of the likes textview and reload that textview to display new likes. Limit the likes to only be able to like a post once.

            }
        });

        reply.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast toast = Toast.makeText(getContext(), "reply button pressed", Toast.LENGTH_SHORT);
                toast.show();
                //passing data for the reference in the replies class.



            }
        });

    return convertView;


}
}
我把它放在getPostKey之后

另一个:

if (btnClickListener != null)
                    btnClickListener.onButtonClick((Integer) view.getTag());}
此外,由于arrayAdapter出现错误,因此必须将其更改为:

 final MessagesListAdapter arrayAdapter = new  MessagesListAdapter(this, arrayMessages, new MessagesListAdapter.ButtonClickListener() {}
以下是我将数据发布到firebase的方式:

btn_send_msg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Date date = new Date();
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            String dtSent = ((dateFormat.format(date).toString()));

            Map<String, Object> map = new HashMap<String, Object>();
            temp_key = root.push().getKey();
            // temp key is the randomly generated key
            root.updateChildren(map);

            DatabaseReference message_root = root.child(temp_key);
            Map<String, Object> map2 = new HashMap<String, Object>();
            map2.put("uid", user_name);
            map2.put("msg", input_msg.getText().toString());
            map2.put("likes","0");
            map2.put("date",dtSent);

            message_root.updateChildren(map2);
            input_msg.setText("");
        }
    });

从我在评论中发布的答案中可以看出,您可以使用一个void方法和int作为parametar在适配器类中创建一个接口,例如:

public interface ButtonClickListener {
   public abstract void onButtonClick(int position);
}
private ButtonClickListener btnClickListener = null;
public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels, ButtonClickListener btnClickListener){
super(context,0, dataModels);
this.dataModels = dataModels;
this.btnClickListener = btnClickListener;
}
likes.setTag(position);
likes.setOnClickListener(new View.OnClickListener{
   @Override
    public void onClick(View v) {

    if(btnClickListener != null)
        btnClickListener.onButtonClick((Integer) v.getTag());                
   }
});
private String postKey;

public String getPostKey() {
    return postKey;
}

public void setPostKey(String postKey) {
    this.postKey = postKey;
}
然后在适配器类的构造函数中使用它,以便可以在活动中重写它,并单击preform按钮。例如:

public interface ButtonClickListener {
   public abstract void onButtonClick(int position);
}
private ButtonClickListener btnClickListener = null;
public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels, ButtonClickListener btnClickListener){
super(context,0, dataModels);
this.dataModels = dataModels;
this.btnClickListener = btnClickListener;
}
likes.setTag(position);
likes.setOnClickListener(new View.OnClickListener{
   @Override
    public void onClick(View v) {

    if(btnClickListener != null)
        btnClickListener.onButtonClick((Integer) v.getTag());                
   }
});
private String postKey;

public String getPostKey() {
    return postKey;
}

public void setPostKey(String postKey) {
    this.postKey = postKey;
}
完成此操作后,您将能够在活动中的适配器创建内部实现click listener,然后在内部使用position获取post的键,并使用该键检索特定post上有多少喜欢的内容,进行增量并再次设置值。在模型类中创建一个新的getter和setter来存储密钥,例如:

public interface ButtonClickListener {
   public abstract void onButtonClick(int position);
}
private ButtonClickListener btnClickListener = null;
public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels, ButtonClickListener btnClickListener){
super(context,0, dataModels);
this.dataModels = dataModels;
this.btnClickListener = btnClickListener;
}
likes.setTag(position);
likes.setOnClickListener(new View.OnClickListener{
   @Override
    public void onClick(View v) {

    if(btnClickListener != null)
        btnClickListener.onButtonClick((Integer) v.getTag());                
   }
});
private String postKey;

public String getPostKey() {
    return postKey;
}

public void setPostKey(String postKey) {
    this.postKey = postKey;
}
您需要将密钥存储在sePostKey中,以便从getPostKey获取密钥。然后,您可以轻松地从MessagesListDataModel获取它:


也许这个过程可以简化,或者使用其他更好的方法,但这只是一个想法,你们可以如何实现你们想要的。我没有测试这段代码,我希望它能工作。

在这种情况下,您需要从特定项目/帖子中检索喜欢的数量,然后进行增量并再次保存。要在适配器内部实现单击特定视图,您可以创建一个接口。例如,这个答案可能会帮助您:类似这样的问题,但我如何才能获得密钥?这是在主方法中设置的,而不是适配器getRef是什么?我应该创建一个函数来在模型类中返回它吗?或这是一个无法解析的方法。是的,很抱歉getRef只能在datasnapshot上访问。另一个解决方案是在模型类中创建一个新的getter和setter,设置密钥,然后获取密钥。我将编辑答案。我已经做了更改,还添加了一个祝酒词,看看按下按钮时是否得到了正确的键。但是,它显示了两个空引用错误。请看编辑。您是如何获取密钥的?您是如何将密钥存储在数据库中然后检索的?是的,我确实意识到这一点,感谢您的帮助,我将继续努力,希望能够将其排序。