在用户单击 listView 项目上的按钮的 Firebase 数据库上写入

Posted

技术标签:

【中文标题】在用户单击 listView 项目上的按钮的 Firebase 数据库上写入【英文标题】:Write on Firebase Database that user clicked button on listView item 【发布时间】:2020-09-30 00:02:21 【问题描述】:

我有一个带有自定义适配器的 listView,该适配器在我的列表视图的每个项目上都包含文本 + 按钮。我正在从 firebase 检索文本没有问题,但我希望如果用户单击项目的按钮,它将写入该用户单击该项目的数据库。

如果有人可以帮助我,给我一个想法或发送链接,谢谢。

我想检索我放在 listView 上的消息的索引(rec_1、rec_2、rec_3 等),如果用户单击按钮,我会在数据库索引上写入 - userId:1 或类似的东西,但是我如何将索引值隐藏在列表视图的每个项目上,以便在单击按钮时可以检索?只是一个ideia,如果有更好的选择,请告诉我!

我的代码:

activity_recados_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <TextView
        android:id="@+id/textRecados"
        android:layout_
        android:layout_
        android:layout_centerVertical="true" />

    <Button
        android:id="@+id/buttonRecadoVisto"
        android:layout_
        android:layout_
        android:layout_below="@id/textRecados"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Visto" />

</RelativeLayout>

RecadosCustomAdapter.java

public class RecadosCustomAdapter extends BaseAdapter implements ListAdapter 
    private ArrayList<String> recadosList = new ArrayList<String>();
    private Context context;


    public RecadosCustomAdapter(ArrayList<String> recadosList, Context context) 
        this.recadosList = recadosList;
        this.context = context;
    

    @Override
    public int getCount() 
        return recadosList.size();
    

    @Override
    public Object getItem(int pos) 
        return recadosList.get(pos);
    

    @Override
    public long getItemId(int position) 
        //return recadosList.get(pos).getId();
        return 0;
    

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
        View view = convertView;
        if (view == null) 
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.activity_recados_item, null);
        

        //Handle TextView and display string from your list
        TextView listItemText = (TextView)view.findViewById(R.id.textRecados);
        listItemText.setText(recadosList.get(position));

        //Handle buttons and add onClickListeners
        Button buttonVisto = (Button)view.findViewById(R.id.buttonRecadoVisto);

        buttonVisto.setOnClickListener(new View.OnClickListener()
            @Override
            public void onClick(View v) 
                //do something
            
        );

        return view;
    

RecadosActivity.java

ValueEventListener valueEventListener = myRef.limitToLast(15).addValueEventListener(new ValueEventListener() 

            ArrayList<String> recadosList = new ArrayList<String>();
            RecadosCustomAdapter adapter = new RecadosCustomAdapter(recadosList, RecadosActivity.this);

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 
                recadosList.clear();
                adapter.notifyDataSetChanged();
                for (DataSnapshot ds : dataSnapshot.getChildren()) 
                    RecadosInformation rInfo = new RecadosInformation();
                    rInfo.setData(ds.getValue(RecadosInformation.class).getData());
                    rInfo.setMensagem(ds.getValue(RecadosInformation.class).getMensagem());

                    Log.d(TAG, "showData: Data: " + rInfo.getData());
                    Log.d(TAG, "showData: Mensagem: " + rInfo.getMensagem());

                    recadosList.add(rInfo.getData() + "\n" + rInfo.getMensagem() + "\n");

                
                Collections.reverse(recadosList);
                recados.setAdapter(adapter);
            

            @Override
            public void onCancelled(DatabaseError databaseError) 

            
        );

如果有人可以帮助我,谢谢!

【问题讨论】:

【参考方案1】:

我认为你应该这样做: FirebaseDatabase.getInstance().getReference("YOUR_NODE").child("child").setValue(yourvalue);

我想你明白了吗? 阅读此处了解更多信息:https://firebase.google.com/docs/database/android/read-and-write

Edit 你会知道在 getView 方法中,该方法会为列表中的每个项目调用,所以当你点击一个按钮时,使用 int 位置 来获取项目的特定位置

做:

@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    View view = convertView;
    if (view == null) 
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.activity_recados_item, null);
    

    //Handle TextView and display string from your list
    TextView listItemText = (TextView)view.findViewById(R.id.textRecados);
    listItemText.setText(recadosList.get(position));

    //Handle buttons and add onClickListeners
    Button buttonVisto = (Button)view.findViewById(R.id.buttonRecadoVisto);

    buttonVisto.setOnClickListener(new View.OnClickListener()
        @Override
        public void onClick(View v) 
            //upload the index which is position
        
    );

    return view;

编辑 2 使用 push().getKey() 方法在 firebase 数据库中为每条消息提供一个 id。所以在你的 getView() 中做:

String id = yourlist.get(position).getId();

然后用它做你想做的事。

【讨论】:

我明白了,但是我怎么知道listView上点击了哪条消息?所以我可以把被点击的消息放在数据库中是“已读” 所以我将使用 push().getKey() 在 Firebase 上生成和检索一个 id,我将与 int 位置和我的用户相关联?如果是这样,即使我使用 myRef 这也可以.limitToLast(15) 和 listView 上的消息会发生变化吗?我怎么知道哪个信息处于那个位置?对不起,如果我很烦人 对不起,你到底想写什么到数据库。如果我点击其中一项中的按钮,会发生什么?? 我正在检索 15 条最新消息,当用户单击 listView 上一项的按钮时,我想将用户确​​认已阅读该消息单击的数据库放入。你明白了吗?英语不是我的母语 这就是为什么每条消息都有一个标识。因为您需要它写入用户已阅读消息的数据库

以上是关于在用户单击 listView 项目上的按钮的 Firebase 数据库上写入的主要内容,如果未能解决你的问题,请参考以下文章

Android:从自定义列表视图中单击的按钮获取列表视图项目

取消选择 ListView 中的项目

与 ListView 战斗

更改按钮上的标签文本单击列表视图项内

如何选择/突出显示列表视图中的项目而不触摸它?

如何在单击 ListView 中的按钮时取消选中所有列表项