Java 我只是想知道我的listview是否会在每次单击时将用户引导到一个新屏幕
} 无论我点击哪个项目,都会将我引向同一个房间。我想改变这一点。我希望用户根据在listview中单击的项目转到不同的房间。我的逻辑正确吗?如果是,我哪里出错了 遵循教程。不确定我的回调应该是什么。。。留白了。。。你能帮我吗Java 我只是想知道我的listview是否会在每次单击时将用户引导到一个新屏幕,java,android,database,firebase,firebase-realtime-database,Java,Android,Database,Firebase,Firebase Realtime Database,} 无论我点击哪个项目,都会将我引向同一个房间。我想改变这一点。我希望用户根据在listview中单击的项目转到不同的房间。我的逻辑正确吗?如果是,我哪里出错了 遵循教程。不确定我的回调应该是什么。。。留白了。。。你能帮我吗 再次更新我的代码。。。有什么问题吗?使用您在侦听器中获得的索引从数据集中获取rId的值和名称。 当前,您正在为每个单击的项目传递存储在rId和name变量中的值,这就是为什么您总是得到相同的值的原因。您不能简单地将rId和name声明为全局变量,而只是在onDataChan
再次更新我的代码。。。有什么问题吗?使用您在侦听器中获得的索引从数据集中获取rId的值和名称。
当前,您正在为每个单击的项目传递存储在rId和name变量中的值,这就是为什么您总是得到相同的值的原因。您不能简单地将rId和name声明为全局变量,而只是在onDataChange之外使用它们。这是因为onDataChange具有异步行为,当您将这些变量添加到您的意图对象中时,这些变量尚未加载 解决问题的一个快速方法是只在onDataChange方法内部使用这些值,或者如果需要在外部使用这些值,则需要创建自己的自定义回调。为此,我建议您查看我的anser的最后一部分,并查看此部分 要获取单击的项目,您需要使用以下方法之一:
public class HomeScreen_Contacts extends Fragment {
TextView noUsersText;
ProgressDialog mProgressDialogue;
FirebaseAuth mAuth;
FirebaseUser currentUser;
String UID;
String name;
String rId;
ArrayAdapter<String> adapter;
ListView usersList;
ArrayList<String> al = new ArrayList<>();
ListView listView;
DatabaseReference rootRef;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
usersList = (ListView) rootView.findViewById(R.id.usersList);
noUsersText = (TextView) rootView.findViewById(R.id.noUsersText);
mAuth = FirebaseAuth.getInstance();
currentUser = mAuth.getCurrentUser();
UID = mAuth.getCurrentUser().getUid();
mProgressDialogue = new ProgressDialog(getActivity());
mProgressDialogue.setMessage("Loading...");
mProgressDialogue.show();
rootRef = FirebaseDatabase.getInstance().getReference();
listView = (ListView) rootView.findViewById(R.id.usersList);
readData(new MyCallback() {
@Override
public void onCallback(List<String> al) {
for (String name : al) {
Log.d("TAG", name);
}
}
});
usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getActivity(), Chat.class);
intent.putExtra("Recievers_Id", rId);
intent.putExtra("Recievers_Name", name);
Log.d("RID", rId);
Log.d("RN", name);
startActivity(intent);
}
});
return rootView;
}
public void readData(final MyCallback myCallback) {
DatabaseReference usersRef = rootRef.child("Users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, al);
for (DataSnapshot ds : dataSnapshot.getChildren()) {
name = ds.child("Name").getValue().toString();
rId = ds.child("Phone_Number").getValue().toString();
al.add(name);
}
listView.setAdapter(adapter);
mProgressDialogue.dismiss();
myCallback.onCallback(al);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getActivity(), "Please Check Your Internet Connection", Toast.LENGTH_SHORT).show();
}
};
usersRef.addListenerForSingleValueEvent(eventListener);
}
public interface MyCallback {
void onCallback(List<String> al);
}
或
编辑1:根据您最近的编辑,请执行以下步骤:
如下更改界面:
al.get(position)
myCallback.onCallback(al);
最后,只需像这样迭代ArrayList:
al.get(position)
myCallback.onCallback(al);
Edit2:这是全部代码。定义接口:
readData(new MyCallback() {
@Override
public void onCallback(List<String> al) {
for(String name : al) {
Log.d("TAG", name);
}
}
})
定义方法:
public interface MyCallback {
void onCallback(List<String> al);
}
然后只需在onCreate方法中调用该方法:
public void readData(final MyCallback myCallback) {
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> al = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String name = ds.child("Name").getValue(String.class);
String rId = ds.child("Phone_Number").getValue(String.class);
al.add(name);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, al);
ListView listView = (ListView) rootView.findViewById(R.id.usersList);
listView.setAdapter(adapter);
mProgressDialogue.dismiss();
myCallback.onCallback(al);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getActivity(), "Please Check Your Internet Connection", Toast.LENGTH_SHORT).show();
}
};
usersRef.addListenerForSingleValueEvent(eventListener);
}
输出应该是所有用户的名称。我的逻辑正确吗。调试代码。无论我单击哪个项。。。Logcat只返回一个数字和一个名称。我不知道为什么会有这个问题。因为现在对我来说它看起来像是一个分配任务。利用int-position参数onItemClick。您必须提供自定义适配器实现来显示这两个字段。跟我来。我还以为定制适配器是给回收商的呢。不要介意。我能知道如何在我的项目中实现吗?抱歉,仍然是一个学习者chatactivity没有问题,因为在logcat中,当我单击项目时。。。无论我单击哪个项目,都只返回一个名称和一个数字。Idk我出错的地方您需要使用在OnItemClickListener中获得的索引从数据集中删除和命名当前您正在为单击的每个项传递存储在rid和name变量中的值。。这就是为什么你总是单身我该怎么做?请给我密码好吗?仍然是一个初学者,通常是关于stackoverflow的,我们期待更多关于问题答案的细节;这段对话已经结束。
readData(new MyCallback() {
@Override
public void onCallback(List<String> al) {
for (String name : al) {
Log.d("TAG", name);
}
}
});