【问题标题】:Just want to know whether my listview is directing user to a new screen for every itemclick只想知道我的列表视图是否将用户重定向到每个项目点击的新屏幕
【发布时间】:2018-03-26 15:10:45
【问题描述】:
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);
}

}

无论我点击哪个项目,都会将我引导到同一个房间。我想改变它。我希望用户根据他在列表视图中单击的项目去不同的房间。我的逻辑正确吗?如果是的话我哪里出错了

按照教程进行操作。不确定 myCallback 下应该包含什么...留空...你能帮我吗

再次更新了我的代码...有什么问题吗?

【问题讨论】:

  • 我的逻辑正确吗?调试您的代码 .
  • 无论我点击哪个项目... Logcat 只返回一个数字和一个名称。我无法弄清楚为什么
  • 添加这个有问题的。因为现在对我来说它看起来像是一个分配任务。
  • 利用int position参数onItemClick()。您必须提供自定义适配器实现来显示这两个字段。关注This
  • 我认为自定义适配器仅适用于回收商。没关系。请问我可以知道如何在我的项目中实现它吗?抱歉还是个学习者

标签: java android database firebase firebase-realtime-database


【解决方案1】:

您不能简单地将rIdname 声明为全局变量,而只是在onDataChange() 之外使用它们。发生这种情况是因为 onDataChange() 具有异步行为,并且当您将这些变量添加到您的 Intent 对象中时,这些变量尚未加载。

快速解决您的问题的方法是仅在 onDataChange() 方法内使用这些值,或者如果您在外部需要它们,您需要创建自己的自定义回调,为此我建议您查看我分析器的最后一部分来自这个post,也看看这个video

要获取被点击的项目,您需要使用以下方法之一:

adapter.getItem(position);

al.get(position)

Edit1:根据您的最新编辑,请按照以下步骤操作:

改变界面如下:

public interface MyCallback {
    void onCallback(List<String> al);
}    

然后在onDataChange() 方法中,在mProgressDialogue.dismiss(); 行之后添加以下代码行:

myCallback.onCallback(al);

最后,只需像这样遍历ArrayList

readData(new MyCallback() {
    @Override
    public void onCallback(List<String> al) {
        for(String name : al) {
            Log.d("TAG", name);
        }
    }
})

Edit2:这是整个代码。定义接口:

public interface MyCallback {
    void onCallback(List<String> al);
}

定义方法:

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);
}

然后只需在 onCreate() 方法中调用该方法即可:

readData(new MyCallback() {
    @Override
    public void onCallback(List<String> al) {
        for (String name : al) {
            Log.d("TAG", name);
        }
    }
});

输出应该是所有用户的名字。

【讨论】:

【解决方案2】:

使用您在 onItemclickListener 中获得的索引从数据集中获取 rId 和名称的值。 目前,您正在为单击的每个项目传递存储在 rId 和 name 变量中的值,这就是为什么您总是得到相同的值

【讨论】:

  • chatactivity 没有问题,因为在 logcat 中,当我单击项目时……我单击的任何项目都只返回一个名称和一个数字。我知道我哪里出错了
  • 您需要使用您在 onItemclickListener 中获得的索引从数据集中删除和命名
  • 目前您正在为您单击的每个项目传递存储在 rId 和名称变量中的值。这就是为什么您总是得到单个值
  • 我该怎么做?请问我可以得到代码吗?仍然是初学者对不起
  • 通常在 stackoverflow 上,我们希望得到更多关于问题答案的详细信息。
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多