使用自定义列表视图布局中的按钮增加Int的值 [英] Increment the value of an Int using a button from a custom listview layout

查看:79
本文介绍了使用自定义列表视图布局中的按钮增加Int的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近设法制作了一个自定义列表视图布局,并从列表视图填充了该数据.
列表视图包含一个喜欢"按钮和一个文本视图,用于存储喜欢的数量.然而,我似乎无法弄清楚如何获取该int并在按下按钮时将其递增,因为这将在CustomAdapter中执行.

I have recently managed to make a custom listview layout and populate that data from a listview.
The listview contains a "Like" Button and a textview storing the amount of likes. Yet i cant seem to figure out how to take that int and increment it on button press as the will be performed in the 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;


}
}

在like.SetOnClickListener中,如何从存储为喜欢"的firebase数据库中检索数据,如何通过添加1来更新int并将其存储回数据库中?

In the like.SetOnClickListener, how can i retrieve data from firebase database stored as "likes", update the int by adding 1 and store it back into the database?

这甚至可以在适配器中完成,还是需要在填充数据的主要活动"中进行?我不确定该如何处理.

Can this even be done in the adapter or does this need to take place in the "main activity" of where the data gets populated? Im not sure how to go about this.

另一个问题是,textviews不接受Int的内容,因此执行此操作时我需要将其从字符串转换为int并返回?

Also another problem is that the textviews dont accept Int's so i need to be converting from string to int and back when doing this?

主要活动:

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

    //for sending messages to database
    btn_send_msg = (Button) findViewById(R.id.btn_send);
    input_msg = (EditText) findViewById(R.id.msg_Input);

    //Date time
    //DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    //dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    //Date date = new Date();
    //String dtSent = ((dateFormat.format(date).toString()));



    //UserData student ID
    FirebaseUser loggedinFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    String userId = loggedinFirebaseUser.getUid();

    room_name = getIntent().getExtras().get("room_name").toString();
    setTitle(" Room - " + room_name);


    //stores the reference as a string to be passed onto the userDataReference table
    databaseUrlRef = "users/userData" + "/" + userId;
    userDataRef = FirebaseDatabase.getInstance().getReference(databaseUrlRef + "/SID");
    chatroomsref = FirebaseDatabase.getInstance().getReference("Chatrooms").child(room_name);

    ///////
    final MessagesListAdapter arrayAdapter = new MessagesListAdapter(this,arrayMessages);

    ListViewMessages = (ListView) findViewById(R.id.chatRoomMessagesListview);
    ListViewMessages.setAdapter(arrayAdapter);


    chatroomsref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //fetchData();
            //for (DataSnapshot child : dataSnapshot.getChildren()) {
                MessagesListDataModel messagesListDataModel =
                        dataSnapshot.getValue(MessagesListDataModel.class);
                arrayMessages.add(messagesListDataModel);

            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });



    /////
    //reference to the database that is within the chatrooms and the room name of the name that was clicked and passed onto this activity.
    root = FirebaseDatabase.getInstance().getReference("Chatrooms/" + room_name);

    userDataRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String Name = dataSnapshot.getValue().toString();
            user_name = Name;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    //https://stackoverflow.com/questions/40891268/how-to-get-firebase-data-into-a-listview
    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("");
        }
    });

}
}

我主要寻找的是如何访问数据库中结构化的(Chatrooms/RoomName/UNIQUE_ID/likes)并更新它.唯一ID是实际的唯一ID.

What im mainly looking for is how could i access this(Chatrooms/RoomName/UNIQUE_ID/likes) as structured in the database, and update it. Where the Unique id is an actual unique id.

致命异常:主要 进程:com.brunelcs.group13.anyquestions,PID:8808 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法"java.lang.String java.lang.String.toString()" 在com.brunelcs.group13.anyquestions.ChatRoom $ 1.onButtonClick(ChatRoom.java:87) 在com.brunelcs.group13.anyquestions.MessagesListAdapter $ 1.onClick(MessagesListAdapter.java:81) 在android.view.View.performClick(View.java:6256) 在android.view.View $ PerformClick.run(View.java:24697) 在android.os.Handler.handleCallback(Handler.java:789) 在android.os.Handler.dispatchMessage(Handler.java:98) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6541) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

FATAL EXCEPTION: main Process: com.brunelcs.group13.anyquestions, PID: 8808 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference at com.brunelcs.group13.anyquestions.ChatRoom$1.onButtonClick(ChatRoom.java:87) at com.brunelcs.group13.anyquestions.MessagesListAdapter$1.onClick(MessagesListAdapter.java:81) at android.view.View.performClick(View.java:6256) at android.view.View$PerformClick.run(View.java:24697) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Toast toast = Toast.makeText(getApplicationContext(), getPostKey.toString(), Toast.LENGTH_SHORT);
            toast.show();

我在getPostKey之后加上的

that i put after getPostKey,

和另一个:

if (btnClickListener != null)
                    btnClickListener.onButtonClick((Integer) view.getTag());}

另外,由于出现错误,必须将arrayAdapter更改为此:

Also the arrayAdapter had to be changed to this as it was comming up with errors:

 final MessagesListAdapter arrayAdapter = new  MessagesListAdapter(this, arrayMessages, new MessagesListAdapter.ButtonClickListener() {}

这是我将数据发布到Firebase中的方式:

This is how i am posting the data into 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("");
        }
    });

推荐答案

从我在评论中发布的答案中可以看出,您可以在Adapter类内部使用一个void方法和int创建接口参数例如:

As you can see from answer I posted you in comment you can create an interface inside your Adapter class with one void method and int as parametar for example:

public interface ButtonClickListener {
   public abstract void onButtonClick(int position);
}

然后在适配器类的构造函数中使用它,以便可以在Activity内部将其override并执行ButtonClick.例如:

Then use this in constructor of your adapter class so you can override it inside your Activity and preform ButtonClick. For example:

private ButtonClickListener btnClickListener = null;
public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels, ButtonClickListener btnClickListener){
super(context,0, dataModels);
this.dataModels = dataModels;
this.btnClickListener = btnClickListener;
}

之后,在like按钮上的AdaptersetTag内,并在其上的setOnclickListener内,获取标记.例如:

After that inside your Adapter class setTag on like button and setOnclickListener on it and get the tag. For example:

likes.setTag(position);
likes.setOnClickListener(new View.OnClickListener{
   @Override
    public void onClick(View v) {

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

完成此操作后,您将能够在Activity中的适配器创建中实现单击侦听器,然后使用position在其中实现发布侦听键,并使用该键,检索您对特定对象的喜欢程度发布,增加并再次设置值.在模型类中创建一个新的gettersetter来存储key,例如:

When you are done with this you will be able to implement click listener inside your adapter creation in Activity and then inside using position get the key of post and with that key, retrieve how many likes you have on specific post, make increment and set the value again. Create a new getter and setter inside your model class to store key for example:

private String postKey;

public String getPostKey() {
    return postKey;
}

public void setPostKey(String postKey) {
    this.postKey = postKey;
}

您将需要将密钥存储在sePostKey中,以便可以从getPostKey获取密钥.然后您可以轻松地从MessagesListDataModel中获取它:

You will need to store the key inside sePostKey so you can get the key from getPostKey. And then you can easily get it from your MessagesListDataModel:

final MessagesListAdapter arrayAdapter = new  MessagesListAdapter(this,arrayMessages, new ButtonClickListener(){
 @Override
  public void onButtonClick(int position) {
   String getPostKey = arrayMessages.get(position).getPostKey();
  //Now you have a key to run another query to get data from specific post and with that number of likes as well
   }
});

可能可以简化过程,也可以使用其他更好的方法,但这只是一个想法,您可以如何实现自己想要的目标.我没有测试此代码,希望它能正常工作.

Probably process could be simplified or to use some another better approach but this is just an idea how you could achieve what you want. I didn't test this code I hope it will work.

这篇关于使用自定义列表视图布局中的按钮增加Int的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆