我如何创建一个新的CardView?

时间:2016-05-01 22:02:46

标签: java android android-layout

我正在尝试添加新的卡片视图/新卡片(对不起,我是新的)到我的应用程序。现在,一切正常,但我会如何添加更多?我还想知道如何在FAB点击上做到这一点。这是我的代码

public class WeatherListAdapter extends RecyclerView.Adapter<WeatherListAdapter.ViewHolder>{

    private List<WeatherData> weatherDataList;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //?
        View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_weather_card,parent,false);
        View view2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_weather_card,parent,false);
        return new ViewHolder(view2);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        WeatherData weatherData = this.weatherDataList.get(position);
        holder.locationTextView.setText(weatherData.getName());
        holder.tempTextView.setText("Temperature: "+weatherData.getWeatherDetails().getTemperature());
        holder.humidTextView.setText("Humidity: "+ weatherData.getWeatherDetails().getHumidity());


    }

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

    protected static class ViewHolder extends RecyclerView.ViewHolder{

        public TextView locationTextView;
        public TextView tempTextView;
        public TextView humidTextView;
        public ViewHolder(View v){
            super(v);
            locationTextView = (TextView) v.findViewById(R.id.locationTextView);
            tempTextView = (TextView) v.findViewById(R.id.tempTextView);
            humidTextView= (TextView) v.findViewById(R.id.humidText);
        }




    }

    public WeatherListAdapter(List<WeatherData> weatherDataList){
        this.weatherDataList = weatherDataList;

    }
}

如果我需要添加更多内容来帮助您解决问题,请发表评论。谢谢! 的 WeatherListActivity -

private RecyclerView recyclerView;
List<WeatherData> mWeatherDataList;
WeatherListAdapter mAdpapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_weather_list);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    mWeatherDataList = new ArrayList<WeatherData>();








    final WeatherApiManager weatherApiManager = new WeatherApiManager();
    weatherApiManager.getWeatherByCoordinate(35.744644099999995, -78.86395929999999, new WeatherCallback() {
        @Override
        public void weatherDownloadCompleted(boolean success, WeatherData weatherData) {
            List<WeatherData> weatherDataList = new ArrayList<WeatherData>();
           // weatherDataList.add(weatherData);
          //  weatherDataList.add(weatherData);

            mAdpapter = new WeatherListAdapter(weatherDataList);






            //why does this have to be in here?
            recyclerView.setAdapter(mAdpapter);

        }
    });



    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            final WeatherApiManager weatherApiManager = new WeatherApiManager();
            weatherApiManager.getWeatherByCoordinate(35.744644099999995, -78.86395929999999, new WeatherCallback() {
                @Override
                public void weatherDownloadCompleted(boolean success, WeatherData weatherData) {
                    List<WeatherData> weatherDataList = new ArrayList<WeatherData>();

                    weatherDataList.add(weatherData);

                    mAdpapter = new WeatherListAdapter(weatherDataList);


                    //why does this have to be in here?
                    recyclerView.setAdapter(mAdpapter);


                }
            });

            updateUI();


        }
    });


}

2 个答案:

答案 0 :(得分:2)

为了在您的RecyclerView中使用CardView(然后附加您之前使用的TextView),我会做这样的事情:

public class WeatherListAdapter extends RecyclerView.Adapter<WeatherListAdapter.ViewHolder>{

    private List<WeatherData> weatherDataList;

    public TextView locationTextView;
    public TextView tempTextView;
    public TextView humidTextView;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Here we are inflating the CardView
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_weather_card, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        WeatherData weatherData = this.weatherDataList.get(position);
        CardView cardView = holder.cardView;

        // We then add these items to each CardView
        locationTextView = (TextView) cardView.findViewById(R.id.locationTextView);
        tempTextView = (TextView) cardView.findViewById(R.id.tempTextView);
        humidTextView= (TextView) cardView.findViewById(R.id.humidText);

        locationTextView.setText(weatherData.getName());
        tempTextView.setText("Temperature: "+weatherData.getWeatherDetails().getTemperature());
        humidTextView.setText("Humidity: "+ weatherData.getWeatherDetails().getHumidity());
    }

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

    protected static class ViewHolder extends RecyclerView.ViewHolder{
        public CardView cardView;

        public ViewHolder(View v){
            super(v);
            // Each ViewHolder only has a CardView (even though that CardView has child TextViews
            cardView = (CardView) v;
        }

    }

    public WeatherListAdapter(List<WeatherData> weatherDataList){
        this.weatherDataList = weatherDataList;
    }
}

然后,您只需确保布局中的adapter_weather_card.xml包含<TextView>locationTextViewtempTextView的{​​{1}}个项目,以便他们都可以显示在每个CardView上。

使用此WeatherListAdapter的示例活动

humidTextView

此活动的示例XML

public class MainActivity extends AppCompatActivity {

    RecyclerView mRecyclerView;
    WeatherListAdapter mAdapter;
    List<WeatherData> mList;

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

        mList = new ArrayList<>();
        // Just a bunch of sample data we're using to populate the RecyclerView
        mList.add(new WeatherData("Sacramento", "88", "60"));
        mList.add(new WeatherData("Dallas", "96", "40"));
        mList.add(new WeatherData("Orlando", "80", "85"));
        mList.add(new WeatherData("Seattle", "68", "78"));

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        // In your WeatherListAdapater class you pass a List to the constructor, this is the
        // list that contains all the WeatherData and the list we use to add new CardViews.
        mAdapter = new WeatherListAdapter(mList);
        mRecyclerView.setAdapter(mAdapter);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Adding a new item to our WeatherData list with the FAB
                // This item will become a new CardView
                // We can similarly remove CardViews by calling remove()
                mList.add(new WeatherData("Boston", "67", "50"));
                // Updating the UI after adding the CardView so it shows up
                updateUI();
            }
        });
    }

    private void updateUI() {
        // The list we passed to the mAdapter was changed so we have to notify it in order to update
        mAdapter.notifyDataSetChanged();
    }

}

示例CardView XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="20dp">
    </android.support.v7.widget.RecyclerView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_menu_add"/>

</RelativeLayout>

答案 1 :(得分:0)

可以使用XML布局文件中的CardView小部件添加简单的卡片视图。这是一个实现的例子:

<!-- Root element of the XML Layout file -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    ... >

    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="200dp"
        android:layout_height="200dp"
        card_view:cardCornerRadius="4dp">

        <!-- Here goes the content of the card -->
        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

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

如果您还没有使用SDK管理器,您还必须下载Android支持库(您可以在可下载列表底部的&#39; Extras&#39;目录中找到它们) content)然后在Gradle配置中添加依赖项:

dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'
}

来源:Android Developers website