java - Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

标签 java android xml android-studio android-5.0-lollipop

请原谅我问这个问题,但我是 Android 开发的新手,虽然我正在尝试了解 developer.android.com 网站上的基础知识,但大多数示例(即使他们说它们是为Android Studio)尚未设置为使用 Gradle,因此除非您将它们迁移到 Gradle,否则不会构建,当您这样做时,它要么不执行任何操作,要么会出现大量错误。

我一直在努力学习如何创建列表。

我从不同的来源阅读了很多关于这方面的教程。我已经阅读了 Android 文档。我什至通读了 Android 示例的源代码,尽管我无法构建其中的一些示例。

我尝试过编写自己的代码,但我只是不理解在 Android 中创建列表控件/元素/ View 并向它们绑定(bind)/插入数据背后的逻辑(因为缺少更好的词)。

我正在尝试创建一个 CardView列表。我不明白如何创建一个列表(任何类型)并在运行时将 items 插入其中(例如在 foreach 循环中)。我以为 CardView 是它自己的列表,但事实证明它只是另一个控件/ View ,有点像列表项,你可以向列表中添加很多。我读过您应该将 CardViews 放在 RecyclerView 中(我认为这是一个列表)。但是我尝试过的所有示例甚至都因为错误而无法构建。因此,这只会在尝试了解事物的工作原理时增加困惑。

例如,如何创建 RecyclerView 列表并在运行时在 for/foreach 循环中向其中添加 CardView 项目?

enter image description here

最佳答案

我举了一个例子。当我回到家时,我会用解释更新它。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:padding="16dp"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Title"
        android:id="@+id/etTitle" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Description"
        android:id="@+id/etDescription" />

    <Button
        android:id="@+id/btnAddItem"
        android:text="Add Item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@android:color/transparent"
        android:layout_weight="1"
        android:id="@+id/lvList" />

</LinearLayout>

list_row_layout.xml

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_margin="8dp"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/txtTitle"
            android:padding="12dp"
            android:layout_width="match_parent"
            android:textColor="@android:color/black"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/txtDescription"
            android:padding="12dp"
            android:layout_width="match_parent"
            android:textColor="@android:color/black"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.v7.widget.CardView>

ListData.java

public class ListData {
    String title;
    String Description;

    public String getTitle() {
        return title;
    }

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

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }
}

列表适配器

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class ListAdapter extends BaseAdapter {
    ArrayList<ListData> myList = new ArrayList<ListData>();
    Context context;

    public ListAdapter(Context context, ArrayList<ListData> myList) {
        this.myList = myList;
        this.context = context;
    }

    @Override
    public int getCount() {
        return myList.size();
    }

    @Override
    public ListData getItem(int position) {
        return myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ListViewHolder view = (ListViewHolder) convertView;
        if (view == null) {
            view = new ListViewHolder(context);
        }
        ListData log = getItem(position);
        view.setLog(log);
        return view;
    }
}

ListViewHolder

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;


public class ListViewHolder extends LinearLayout {
    Context mContext;
    ListData mLog;

    public ListViewHolder(Context context) {
        super(context);
        mContext = context;
        setup();
    }

    public ListViewHolder(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        setup();
    }

    private void setup() {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.list_row_layout, this);
    }

    public void setLog(ListData log) {
        mLog = log;
        TextView tvTitle = (TextView) findViewById(R.id.txtTitle);
        tvTitle.setText(mLog.getTitle() + "");
        TextView tvDescription = (TextView) findViewById(R.id.txtDescription);
        tvDescription.setText(mLog.getDescription() + "");
    }
}

主 Activity

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {
    Button btnAddItem;
    ListView lvList;
    ArrayList<ListData> myList = new ArrayList<ListData>();
    ListAdapter listAdapter;
    EditText etTitle, etDescription;
    String title = "", description = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvList = (ListView) findViewById(R.id.lvList);
        listAdapter = new ListAdapter(MainActivity.this, myList);
        lvList.setAdapter(listAdapter);
        etTitle = (EditText) findViewById(R.id.etTitle);
        etDescription = (EditText) findViewById(R.id.etDescription);
        btnAddItem = (Button) findViewById(R.id.btnAddItem);
        btnAddItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                title = etTitle.getText().toString();
                description = etDescription.getText().toString();
                if (title.length() == 0) {
                    title = "Not Title";
                }
                if (description.length() == 0) {
                    description = "No Description";
                }
                ListData mLog = new ListData();
                mLog.setTitle(title);
                mLog.setDescription(description);
                myList.add(mLog);
                listAdapter.notifyDataSetChanged();
            }
        });
        lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ListData mLog = listAdapter.getItem(position);
                Toast.makeText(MainActivity.this, "Title: " + mLog.getTitle() + "  Description: " + mLog.getDescription(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

渐变

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "your application id"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.android.support:cardview-v7:21.+'
}

它应该是什么样子 enter image description here

关于java - Android 中的列表(特别是 RecyclerView 和 CardView)如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908680/

相关文章:

android - 如何通过servlet从android应用程序将信息保存到mysql

c# - 从 XElement 中删除属性

java - 获取 jert.jar、jnet.jar 和 jsse.jar?

java - 为什么 Cloneable 没有 clone()?

java - 动态包含在 JSP 模板中

android - Android Q保存媒体文件未显示在图库中

android - 滚动在 WebView 上反向工作

java - <servlet> 和 <servlet-mapping> 中的 servlet-name 可以不同吗?

xml - 将平面层次结构转换为 XSLT 深度的嵌套层次结构

java.sql.SQLException : Illegal operation on empty result set 异常