Android mTracks大小为0我不知道检索返回空值的原因
1-主要活动: 三声片段:Android mTracks大小为0我不知道检索返回空值的原因,android,firebase,android-asynctask,firebase-realtime-database,Android,Firebase,Android Asynctask,Firebase Realtime Database,1-主要活动: 三声片段: 无需在onPostExecute中调用此函数,因为它仅被设置 listView.setAdapter(mAdapter); 你怎么知道你的行李架是空的?您是否尝试记录任何值?另外,如果listView为空,我建议您在asyncTask中的doInBackground中的addAll方法之后调用notifyDatasetChanged。此外,您是否已编辑firebase实时数据库中的数据库规则以使其可读?因为默认情况下,除非您经过身份验证,否则您无法读取或写入fire
无需在onPostExecute中调用此函数,因为它仅被设置
listView.setAdapter(mAdapter);
你怎么知道你的行李架是空的?您是否尝试记录任何值?另外,如果listView为空,我建议您在asyncTask中的doInBackground中的addAll方法之后调用notifyDatasetChanged。此外,您是否已编辑firebase实时数据库中的数据库规则以使其可读?因为默认情况下,除非您经过身份验证,否则您无法读取或写入firebase数据库。我尝试记录大小为0的mTracks值,我已在firebase实时数据库中编辑数据库规则以使其可读。好的,我将查看代码,但在我看来,仅仅为了从数据库中获取数据,您所做的开销太大了。例如,在onChildAdded中,您可以简单地在dataSnapshot中传递Music.class,然后直接从那里添加项目。此外,您正在使用太多的静态对象,这一点都不好,应该避免。最后,Firebase自动在一个单独的线程上进行网络调用,因此不需要使用asynctask,除非您在回调上做一些繁重的工作。参考这个答案:现在检查这个!那么现在会发生什么呢?当mTracks来的时候null@Tulsi如果这不是一个答案,你应该在评论中继续它。我认为这可以完成这项工作,因为设置另一个适配器肯定会导致问题!在这里,你否决了一个答案,因为它是不完整的!但让我告诉你,这并不是不正确的@HarshitDwivedi
public class SoundActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sound);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(R.id.container, new SoundFragment()).commit();
}
}
public class SoundFragment extends Fragment {
static SCTrackAdapter mAdapter;
static DatabaseReference db;
static FirebaseHelper helper;
private TextView mSelectedTrackTitle;
static ArrayList<Music> mTracks = new ArrayList<>();
static MediaPlayer mMediaPlayer;
private ImageView mPlayerControl;
static String Artist;
static ListView listView;
int currentTrack;
private static String fileName;
public SoundFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
new Fetchtracks().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_sound, container, false);
Intent intent = getActivity().getIntent();
if (intent != null) {
Artist = intent.getStringExtra("Artist");
}
listView = (ListView) rootView.findViewById(R.id.track_list_view);
mAdapter = new SCTrackAdapter(getActivity(), mTracks);
listView.setAdapter(mAdapter);
return rootView;
}
public class SCTrackAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<Music> mTracks;
public SCTrackAdapter(Context context, ArrayList<Music> tracks) {
mContext = context;
mTracks = tracks;
}
public void update_tracks(ArrayList<Music> list)
{
mTracks.clear();
mTracks.addAll(list);
}
@Override
public int getCount() {
return mTracks.size();
}
@Override
public Music getItem(int position) {
return mTracks.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.track_list_row, parent, false);
holder = new ViewHolder();
holder.titleTextView = (TextView) convertView.findViewById(R.id.track_title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleTextView.setText(mTracks.get(position).getName());
return convertView;
}
static class ViewHolder {
TextView titleTextView;
}
}
public class Fetchtracks extends AsyncTask<Void, Void, ArrayList<Music>> {
@Override
protected ArrayList<Music> doInBackground(Void... voids) {
db = FirebaseDatabase.getInstance().getReference().child(Artist);
helper = new FirebaseHelper(db);
mTracks.addAll(helper.retrieve());
Log.e("doInBackground: ",helper.retrieve()+"");
return mTracks;
}
@Override
protected void onPostExecute(ArrayList<Music> list) {
super.onPostExecute(list);
Log.e("doInBackground: ",list.size()+"");
mAdapter.update_tracks(list);
mAdapter.notifyDataSetChanged();
}
}
public class FirebaseHelper {
DatabaseReference db;
Boolean saved=null;
ArrayList<Music> A = new ArrayList<>();
public FirebaseHelper(DatabaseReference db) {
this.db = db;
}
//WRITE
public Boolean save(Music m)
{
if(m==null)
{
saved=false;
}else
{
try
{
// db.child(Artist).push().setValue(m);
saved=true;
}catch (DatabaseException e)
{
e.printStackTrace();
saved=false;
}
}
return saved;
}
//READ
public ArrayList<Music> retrieve()
{
A.clear();
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.e("onChildAdded: ", "1");
fetchData(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.e("onChildAdded: ", "2");
fetchData(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
// Log.e("onChildAdded: ", "3");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
// Log.e("onChildAdded: ", "4");
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Log.e("onChildAdded: ", "5");
}
});
return A;
}
private void fetchData(DataSnapshot dataSnapshot)
{
Music m=new Music();
m.setName(dataSnapshot.child("name").getValue().toString());
m.setUrl(dataSnapshot.child("url").getValue().toString());
A.add(m);
// SoundFragment.mTracks.add(m);
// Log.e("onFetch: ", SoundFragment.mTracks.size()+"");
}
public class Music {
String name;
String url;
public Music() {
}
public void setName(String name) {
this.name = name;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public String getURL() {
return url;
}
}
listView.setAdapter(mAdapter);