【问题标题】:mTracks size is 0 I Do not know why retrieve returns nullmTracks 大小为 0 我不知道为什么检索返回 null
【发布时间】:2017-01-04 10:26:37
【问题描述】:

1- MainActivity:

public class MainActivity extends AppCompatActivity {

    private List<String> mListItems = Arrays.asList("Hamaki","Amr Diab");
    private ArtistsAdapter mAdapter;

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

        ListView listView = (ListView)findViewById(R.id.Artist_list_view);

        mAdapter = new ArtistsAdapter(this, mListItems);
        listView.setAdapter(mAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    Intent intent = new Intent(MainActivity.this,SoundActivity.class);
                    intent.putExtra("Artist", mListItems.get(position));
                    startActivity(intent);
                }

        });

    }

}

2-声音活动:

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

4- STrack 适配器:

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

}

5- Fetchtracks:

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

6- FirebaseHelper

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()+"");

}

}

7- 音乐:

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

【问题讨论】:

  • 你怎么知道你的 mTrack 是空的?您是否尝试记录它的任何值?此外,如果 listView 为空,我建议您在 asyncTask 中的 doInBackground 中的 addAll() 方法之后调用 notifyDatasetChanged()
  • 另外,您是否已将 Firebase 实时数据库中的数据库规则编辑为可读?因为默认情况下,除非您通过身份验证,否则您无法从 firebase 数据库读取或写入数据
  • 我尝试记录大小为 0 的 mTracks 值,我已将 firebase 实时数据库中的数据库规则编辑为可读。
  • 好的,我会看一下代码,但在我看来,您只是为了从数据库中获取数据而做了太多的开销工作。例如在 onChildAdded 中,您可以简单地将 Music.class 传递到 dataSnapshot 中,然后直接从那里添加项目。此外,您使用的静态对象太多了,这根本不好,应该避免。最后,Firebase 会自动在单独的线程上进行网络调用,因此无需使用 asynctask,除非您正在对回调进行一些繁重的工作。参考这个答案:stackoverflow.com/a/38507491/5471095

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


【解决方案1】:

不需要在 onPostExecute() 中调用它,因为它只是设置了

listView.setAdapter(mAdapter);

【讨论】:

  • 立即查看!现在会发生什么?
  • 当 mTracks 为空时
  • @Tulsi 如果这不是答案,您应该在评论中继续。
  • 我认为这样可以完成工作,因为设置另一个适配器肯定会导致问题!在这里,您对答案投了反对票,因为它不完整!但让我告诉你这是不正确的@HarshitDwivedi
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多