【问题标题】:how to add content in recyclerview dynamically如何在recyclerview中动态添加内容
【发布时间】:2016-08-31 11:45:33
【问题描述】:

我使用带有两个文本视图和评分栏的回收站视图。我在 sqlite 数据库中有一个表,其中包含三个字段 id、name 和 music。现在我想在两个文本视图 tv1 和 tv2 中动态命名和音乐。

我的布局是 `

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="3dp"
    card_view:cardBackgroundColor="@color/popup_tv_color"
    card_view:cardCornerRadius="20dp"
    card_view:cardElevation="0dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="1dp"
        android:id="@+id/linearLayout1"
        android:layout_weight="1">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text="Baatein Ye Kabhi Na"
            android:gravity="center"
            android:textColor="@android:color/holo_red_dark"
            android:textSize="20dp"
            android:id="@+id/tv1"
            android:textStyle="italic"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Bollywood Song"
            android:id="@+id/tv2"
            android:paddingBottom="4dp"
            android:layout_gravity="center_horizontal"/>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:orientation="horizontal">
        <RatingBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/ratingBar1"
            android:stepSize="0.05"
            android:rating="0"
            android:layout_gravity="left"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Play"
                android:textColor="@android:color/white"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="4dp"
                android:layout_marginTop="4dp"
                android:background="@drawable/rounded_button"
                android:backgroundTint="@color/pink"
                android:id="@+id/button"
                android:layout_alignBottom="@+id/ratingBar1"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />


        </RelativeLayout>
    </LinearLayout>

</android.support.v7.widget.CardView>

我的main fragmeng is

<view
    android:id="@+id/recycler_view"
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true" />

sqlite 代码是

public List<String> getAllNames(){
        SQLiteDatabase db=this.getWritableDatabase();
        List<String> musicNames=new ArrayList<String>();
        String SelectQuery="SELECT * FROM "+TABLE_NAME;
        Cursor cursor=db.rawQuery(SelectQuery, null);
        if(cursor.moveToFirst()){

            do{

                int id=cursor.getInt(0);
                String name=cursor.getString(1);
                String music=cursor.getString(2);

                musicNames.add(name);
                musicNames.add(music);

            }while(cursor.moveToNext());
        }

        return musicNames;

    }

现在MusicFragment 类是

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_music, container, false);


        db = new DatabaseHandler(getContext());
        List<String> musicNames = db.getAllNames();

        mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);

        MyAdapter myAdapter=new MyAdapter();

        return v;
    }

适配器类是

public class MyAdapter extends ecyclerView.Adapter<MyAdapter.PlanetViewHolder> {


    ArrayList<String> songList;

    public MyAdapter()
    {
        this.songList = songList;

    }


    @Override
    public MyAdapter.PlanetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.song_list, parent, false);
        PlanetViewHolder viewHolder = new PlanetViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyAdapter.PlanetViewHolder holder, int position) {

        holder.text.setText(songList.get(position).toString());
        // holder.text1.setText(songList.get(position).toString());
    }

    @Override
    public int getItemCount() {
        return songList.size();
    }

    public static class PlanetViewHolder extends RecyclerView.ViewHolder {

        protected CardView card_view;
        protected TextView text;
        // protected TextView text1;

        public PlanetViewHolder(View itemView) {
            super(itemView);
            card_view = (CardView) itemView.findViewById(R.id.card_view);
            text = (TextView) itemView.findViewById(R.id.tv1);
            // text1 = (TextView) itemView.findViewById(R.id.tv2);
        }
    }

我不知道如何添加添加请帮助

【问题讨论】:

  • 你没有为你的 recyclerview 设置适配器
  • 使用this适配器
  • 那么我怎样才能为回收站视图设置适配器
  • RecyclerView#setAdapter
  • 我什么都不懂该怎么办

标签: android


【解决方案1】:

在您的 MyAdapter 类中添加一个新方法并在此方法中传递您的歌曲列表

public void updateData(List<String> songList) {
    this.songList.clear();
    this.songList.addAll(songList);
    notifyDataSetChanged();
}

【讨论】:

    【解决方案2】:

    创建音乐类

    public class Music {
    
    private String name;
    private String song;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getSong() {
        return song;
    }
    
    public void setSong(String song) {
        this.song = song;
    }
    

    将您的 getAllName() 方法更新为

    public List<Music> getAllNames(){
    
        SQLiteDatabase db = this.getWritableDatabase();
        List<Music> musicNames = new ArrayList();
        String selectQuery="SELECT * FROM "+ TABLE_NAME;
        Cursor cursor = db.rawQuery(selectQuery, null);
    
        if(cursor.moveToFirst()){
            do{
                Music music = new Music;
                music.setName(cursor.getString(1));
                music.setSong(cursor.getString(2));
    
                musicNames.add(music);
    
            }while(cursor.moveToNext());
        }
    
        return musicNames;
       }
    

    将您的片段 onCreateView() 更新为

        @Override 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    
        // Inflate the layout for this fragment 
         View v = inflater.inflate(R.layout.fragment_music, container, false);
    
        db = new DatabaseHandler(getActivity());
        List<Music> musicNames = db.getAllNames();
    
        mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
    
        mLayoutManager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mLayoutManager);
    
        MyAdapter myAdapter=new MyAdapter(getActivity(),musicNames);
        mRecyclerView.setAdapter(myAdapter);
    
        return v;
        }
    

    将您的适配器更新为

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.PlanetViewHolder> {
    
        List<Music> songList;
        Context c;
    
        public MyAdapter(Context c, List<Music> songList)
        {
            this.c = c;
            this.songList = songList;
        }
    
    
        @Override
        public MyAdapter.PlanetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.song_list, parent, false);
    
            return new PlanetViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(MyAdapter.PlanetViewHolder holder, int position) {
    
            holder.textName.setText(songList.get(position).getName());
            holder.textSong.setText(songList.get(position).getSong());
        }
    
        @Override
        public int getItemCount() {
            return songList.size();
        }
    
        public static class PlanetViewHolder extends RecyclerView.ViewHolder {
    
            private TextView textName,textSong;
    
            public PlanetViewHolder(View itemView) {
                super(itemView);
    
                textName = (TextView) itemView.findViewById(R.id.tv1);
                textSong = (TextView) itemView.findViewById(R.id.tv2);
            }
        }
        }
    

    【讨论】:

    • 我的添加不幸停止了
    • log cat is 在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。 java.lang.Throwable:在 dalvik.system.CloseGuard.open(CloseGuard.java:180) 处的 java.util.zip.Inflater.(Inflater.java:82) 处未调用显式终止方法 'end' .android.okhttp.okio.GzipSource.(GzipSource.java:62)
    • 这意味着你打开了一些东西,但从未关闭它们。看到这个stackoverflow.com/a/25544167/5545429
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    相关资源
    最近更新 更多