如何使相对布局成为我的 ListView 的一个项目?并通过我的 ListView 检测手势?

How do I make a relative layout an item of my ListView? And detect gestures over my ListView?

我正在尝试制作一个具有相对布局项的 ListView,一个接一个。每个相对布局都包含一个 Button 视图,然后是三个 TextView,它们与 Button 的右侧对齐,并且彼此下方。我的 RelativeLayout XML 代码如下,它很好,但是我该怎么做才能在按下按钮后用这个模板填充我的 ListView,以及我如何操作文本视图中的文本以便他们对每个相关布局项说不同的话?

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <Button
                android:id="@+id/buttonA"
                android:layout_width="100sp"
                android:layout_height="100sp"
                android:layout_marginBottom="8dp"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="8dp"
                android:gravity="center_vertical"
                android:text="SomeText"
                android:textColor="#fff"
                android:onClick="butt"/>
            <TextView
                android:id="@+id/name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name:"
                android:textSize="30sp"
                android:textColor="#000000"
                android:layout_toRightOf="@+id/buttonA"/>
            <TextView
                android:id="@+id/date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Date:"
                android:textSize="30sp"
                android:textColor="#000000"
                android:layout_toRightOf="@+id/buttonA"
                android:layout_below="@+id/name"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Duration:"
                android:textSize="30sp"
                android:textColor="#000000"
                android:layout_toRightOf="@+id/buttonA"
                android:layout_below="@+id/date"/>
        </RelativeLayout>

感谢帮助

编辑:有人让我分享我是如何尝试实现它的。老实说,这就是我完全困惑的部分。我是 java 和一般编程的新手。我查看了此处的文档

http://developer.android.com/reference/android/widget/ListView.html

这里是我尝试将项目添加到列表视图的地方

public void startStop(View view){
    Button ssButton = (Button) findViewById(R.id.ssbutton);
    if(startStopTracker == 0){
        ssButton.setText("STOP");
        ssButton.setBackgroundColor(Color.parseColor("#F44336"));
        startStopTracker = 1;
        enableSwipe = false;
        return;
    }
    if(startStopTracker == 1){
        ssButton.setText("START");
        ssButton.setBackgroundColor(Color.parseColor("#0D47A1"));
        startStopTracker = 0;
        enableSwipe = true;

        convoLV.addView(convoButtons[0]);


        return;
    }
}

其中 convoLV 是列表视图,convoButtons 应该是相对布局的数组。

编辑 2: 我在 getListItemData() 方法中进行了更改,实现了 Nolly 代码的一个版本,以便每次只将一个项目添加到列表中。我还在 activity 中全局初始化了 List listViewItems,以便添加每个项目。到目前为止,这似乎是我正在寻找的。然而;我 运行 遇到一个问题,我的 activity 无法检测到我的 ListView 区域上的手势。这是一个问题,因为我使用 GestureDetector.onGestureListener.onFling() 方法在显示布局之间切换。如何检测 ListView 上的手势?

由于您有一个要添加到 ListView 的布局,

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

<Button
    android:id="@+id/buttonA"
    android:layout_width="100sp"
    android:layout_height="100sp"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:gravity="center_vertical"
    android:onClick="butt"
    android:text="SomeText"
    android:textColor="#fff" />

<TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/buttonA"
    android:text="Name:"
    android:textColor="#000000"
    android:textSize="30sp" />

<TextView
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/name"
    android:layout_toRightOf="@+id/buttonA"
    android:text="Date:"
    android:textColor="#000000"
    android:textSize="30sp" />

<TextView
    android:id="@+id/duration"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/date"
    android:layout_toRightOf="@+id/buttonA"
    android:text="Duration:"
    android:textColor="#000000"
    android:textSize="30sp" />
</RelativeLayout>

然后您必须创建一个 Adapter 来扩充您的布局文件。它会将您的数据绑定到布局中的项目视图。

适配器代码如下

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

import java.util.List;

public class ListAdapter extends BaseAdapter {

private LayoutInflater lInflater;
private List<ItemObjects> listStorage;

public ListAdapter(Context context, List<ItemObjects> customizedListView) {
    lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    listStorage = customizedListView;
}

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

@Override
public Object getItem(int position) {
    return listStorage.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder listViewHolder;
    if (convertView == null) {
        listViewHolder = new ViewHolder();
        convertView = lInflater.inflate(R.layout.list_items, parent, false);

        listViewHolder.image = (Button) convertView.findViewById(R.id.buttonA);

        listViewHolder.name = (TextView) convertView.findViewById(R.id.name);
        listViewHolder.date = (TextView) convertView.findViewById(R.id.date);
        listViewHolder.duration = (TextView) convertView.findViewById(R.id.duration);

        convertView.setTag(listViewHolder);
    } else {
        listViewHolder = (ViewHolder) convertView.getTag();
    }
    listViewHolder.name.setText(listStorage.get(position).getName());
    listViewHolder.date.setText(listStorage.get(position).getDate());
    listViewHolder.duration.setText(listStorage.get(position).getDuration());

    listViewHolder.image.setText(listStorage.get(position).getImage());

    return convertView;
}

static class ViewHolder {

    Button image;
    TextView name;
    TextView date;
    TextView duration;

}
}

创建一个对象 class 来保存布局文件中项目的数据。请参阅下面的代码。您可以根据自己的需要对其进行修改

public class ItemObjects {

private String image;

private String name;
private String date;
private String duration;

public ItemObjects(String image, String name, String date, String duration) {
    this.image = image;
    this.name = name;
    this.date = date;
    this.duration = duration;
}

public String getImage() {
    return image;
}

public String getName() {
    return name;
}

public String getDate() {
    return date;
}

public String getDuration() {
    return duration;
}
}

现在我们将创建一个 Activity 文件及其布局文件。在 activity 布局文件中,在 xml 文件中添加一个 ListView 小部件

<?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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<ListView
    android:id="@+id/mechanics"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:dividerHeight="1.0sp"
    android:scrollbars="none"
    android:background="@android:color/transparent"
    android:cacheColorHint="@android:color/transparent"
    android:layout_centerHorizontal="true"/>

</RelativeLayout>

然后,在您的 activity class 中实例化 ListView。 Adapter class 的对象也已创建。数据对象作为适配器中的参数之一传递 class

最后,调用ListView的setAdapter()方法,将适配器class的对象作为参数传递给它。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class TestingListView extends AppCompatActivity {

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

    ListView mListView = (ListView)findViewById(R.id.mechanics);
    ListAdapter listAdapter = new ListAdapter(this, getListItemData());
    mListView.setAdapter(listAdapter);
}

private List getListItemData() {
    List<ItemObjects> listViewItems = new ArrayList<ItemObjects>();
    listViewItems.add(new ItemObjects("Good", "Peter", "12-03-1989", "400"));
    listViewItems.add(new ItemObjects("Good", "John", "10-04-1999", "560"));
    listViewItems.add(new ItemObjects("Good", "James", "01-09-1970", "320"));
    return listViewItems;
}
}

此代码未经测试。我希望它能让您了解您计划实现的目标。