在用户单击 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 数据库上写入的主要内容,如果未能解决你的问题,请参考以下文章