2016-03-03 1 views
1

Я пытаюсь создать ListView, который имеет элементы относительного размещения, один за другим. Каждый относительный макет состоит из представления Button, за которым следуют три TextViews, выровненные справа от кнопки, и ниже друг друга. Мой XML-код RelativeLayout выглядит следующим образом, и это нормально, но как это сделать, чтобы я мог заполнить свой ListView этим шаблоном после нажатия кнопки и как я могу манипулировать текстом внутри текстовых просмотров, чтобы они говорили разные вещи для каждого элемента относительной компоновки?Как сделать относительный макет элементом моего ListView? И обнаруживать жесты над моим 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> 

Спасибо за помощь

Edit: Кто-то попросил меня рассказать, как я пытаюсь осуществить это. Честно говоря, та часть, с которой я полностью смущен. Я новичок в java и программировании в целом. Я просмотрел документацию здесь

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

здесь, где я пытаюсь добавить элемент в ListView

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 является ListView и convoButtons должен быть массивом относительных макетов.

EDIT 2: Я внедрил версию кода Nolly с изменением метода getListItemData(), чтобы каждый элемент был добавлен в список каждый раз. Я также инициализировал List listViewItems глобально в активности, чтобы каждый элемент добавлялся. Кажется, это пока что то, что я ищу. Однако; Я сталкиваюсь с проблемой, когда моя активность не может обнаружить жесты в области моего ListView. Это проблема, потому что я использую метод GestureDetector.onGestureListener.onFling() для переключения между отображением макетов. Как определить жесты над списком ListView?

+0

Какой код вы пытаетесь? Пожалуйста, поделитесь своим кодом? –

+0

честно, это часть, о которой я совершенно смущен. Я новичок в java и программировании в целом. Я просмотрел документацию здесь http://developer.android.com/reference/android/widget/ListView.html вот где я пытаюсь добавить элемент в список. –

ответ

1

Поскольку у вас есть макет, который вы хотите добавить в 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> 

, то вы должны создать адаптер, который раздувает файл макета. Он привяжет ваши данные к представлениям элементов в вашем макете.

код адаптера ниже

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; 

} 
} 

Создать класс объекта, который будет содержать данные для элементов в файле макета. См. Код ниже. Вы можете изменить его в соответствии с вашими потребностями

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

Теперь мы создадим файл с файлом макета. В файле макета деятельности, добавьте ListView виджет в 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: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> 

Тогда в классе деятельности, то ListView конкретизируется. Также создается объект класса Adapter. Объект данных передается как один из параметров в классе адаптера

Наконец, вызовите метод setAdapter() в ListView и передайте ему объект класса адаптера в качестве параметра.

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

Этот код не проверял. Надеюсь, это даст вам представление о том, чего вы планируете достичь.

+0

Большое спасибо! Я буду экспериментировать с этим и дам вам знать, как это работает. –

+0

Добро пожаловать – Inducesmile

+0

Привет, Nolly, я внедрил версию кода, которую вы предложили, с изменением метода getListItemData(), чтобы каждый элемент добавлялся в список каждый раз , Я также инициализировал List listViewItems глобально в активности, чтобы каждый элемент добавлялся. Кажется, это пока что то, что я ищу. Однако; Я сталкиваюсь с проблемой, когда моя активность не может обнаружить жесты в области моего ListView. Это проблема, потому что я использую метод GestureDetector.onGestureListener.onFling() для переключения между отображением макетов. У вас есть предложения по этому поводу? –