【问题标题】:Passing firebase data from one activty to another, onClick of ListView将firebase数据从一个活动传递到另一个活动,ListView的onClick
【发布时间】:2018-12-01 00:55:40
【问题描述】:

我在将数据从一个活动传递到另一个活动时遇到了一些问题,onItem click 我想将点击的项目的值传递给另一个活动,在下面的代码中,它只是最后一条数据,而不是点击的项目,任何帮助都非常感谢。

            public class list_view extends AppCompatActivity {

private ArrayAdapter<String> arrayAdapter;


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

    final String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference uidRef = rootRef.child("ProgressReports").child(uid);
    final List<String> list = new ArrayList<>();
    final ArrayList<String> id = new ArrayList<>();
    final Context context = this;
    EditText searchBarProgress = findViewById(R.id.searchBarProgress);
    arrayAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, list);

    String key = uidRef.push().getKey();
    ReportInformation report = new ReportInformation();
    report.setTitle("title");
    report.setContent("content");
    report.setKey(key);
    uidRef.child(key).setValue(report);


    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                id.add(ds.getKey());
                String title = ds.child("title").getValue(String.class);
                String content = ds.child("content").getValue(String.class);
                String timestamp = ds.child("timestamp").getValue(String.class);
                list.add(title + "\n" + timestamp + "\n" + content);
                Log.d("TAG", title);
            }
            ListView listView = findViewById(R.id.progressList);
            listView.setAdapter(arrayAdapter);

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };
    uidRef.addListenerForSingleValueEvent(eventListener);

    final ListView progressList = findViewById(R.id.progressList);

    progressList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int x, long l) {

            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    ArrayList<ReportInformation> list = new ArrayList<>();
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        ReportInformation report = ds.getValue(ReportInformation.class);
                        list.add(report);
                    }
                    Intent intent = new Intent(list_view.this, ProgressReports.class);
                    ListView listView = findViewById(R.id.progressList);
                    listView.setAdapter(arrayAdapter);
                    startActivity(intent);
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                        }
                    });
                }


                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            };
            uidRef.addListenerForSingleValueEvent(eventListener);
        }
    });

为了说明我的意思,无论我在下面的列表视图中按下哪个按钮,传递的数据都是测试 4

下面是我的火力基地结构

对象的模型类

public class ReportInformation {
private String title;
private String content;
private String timestamp;
private String key;

public ReportInformation(){

}

public String getTitle() {
    return title;
}

public String getKey() {
    return key;
}

public void setKey(String key) {
    this.key = key;
}

public void setTitle(String title) {
    this.title = title;
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

public String getTimestamp() {
    return timestamp;
}

public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
}
}

尝试执行此操作时出现以下错误

新错误

【问题讨论】:

  • 你的对象有模型类吗?
  • 嗨,亚历克斯,是的,上传到那里,试图实现你所说的 [链接]stackoverflow.com/questions/53560566/… 但在放置意图等方面遇到了困难,我还上传了我所做的远在实现你的方法

标签: java android firebase firebase-realtime-database


【解决方案1】:

要解决这个问题,你需要先实现Serializable这样的接口:

ReportInformation implements Serializable {}

因此,要将整个 ReportInformation 对象传递给下一个活动,您应该使用以下代码行:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        ReportInformation reportInformation = arrayAdapter.getItem(i);
        Intent intent = new Intent(list_view.this, ProgressReports.class);
        intent.putExtra("object", reportInformation);
        startActivity(intent);
    }
});

【讨论】:

  • 在尝试执行此操作时出现错误,卡住了屏幕截图
  • 要解决该错误,请将您的ArrayAdaper 的类型从String 更改为ReportInformation。应该是ArrayAdaper&lt;ReportInformation&gt;。现在可以用了吗?
  • 嗨,Alex,我觉得我们已经很接近了,到目前为止,我对您的帮助非常感谢,但是在更改 ReportInformation(已上传)时遇到了这个错误 可能是我从一开始就把事情复杂化了
  • 将列表类型也更改为ReportInformationList&lt;ReportInformation&gt;.
  • 解决了这个问题,但在最初尝试将数据添加到列表时打开了一个新问题,为所有的麻烦道歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多