2016-07-22 3 views
1

Я работаю над записью приложения с помощью Android Studio, и я использую SQLite для хранения заметок. В настоящее время в MainActivity все заметки отображаются с использованием списка. Я хочу показать заметки в шаблоне сетки с каждой сеткой, имеющей контейнер, который содержит часть текста примечания, а также заголовок и дату, созданные под текстом частичного примечания. Как мне это сделать? Ниже приведена картина, чтобы дать представление о том, что я имею в виду. Представьте себе, что изображения в этой картине частично отображают текст примечания.Показать все заметки в виде сетки Android Studio

a busy cat http://c1.soft112.com/images/06/2e/htc-scribble/pad_screenshot_240x180.png

ли я использовать вид сетки, а затем положить относительное расположение в каждой сетке структурировать частичный текст примечания, название и дата создания? Также я просто храню текст частичного примечания в простом текстовом представлении?

Спасибо!

ответ

0

Да - создать адаптер, как в ListView следующих в GetView в адаптере раздувать ракурс для элемента сетки, то Вы можете использовать RelativeLayout. TextView также может использоваться для сложных текстов не только для текста с одной строкой.

Если вас интересует проверка RecyclerView, которая может использоваться как сетка или список, ее можно динамически изменять, например, если маленький экранный список - если большая сетка экрана.

Если вам нужен частичный текст, то используйте Струнный метод - YourString.substring (0, 20)

Пример GetView в адаптере:

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

    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     LayoutInflater vi; 
     vi = LayoutInflater.from(getContext()); 
     convertView = vi.inflate(R.layout.your_grid_view,null); 


    } 

    YourClassRepresentGridElement current=getItem(position); 
    /* in getItem you should get element from database or from 
     collection which was generated from database 
    */ 


    //here do work with your view set it an values from object 
    //example 
    ((TextView)convertView.findElementById("text")).setText(current.text.substring(0,20)); 

    //remember using findElementById on every getView is not good practice - read about holder 

    return convertView; 


} 
+0

Не могли бы вы перефразировать первую часть вашего ответа? Это немного непонятно – Michael

0

попробуйте использовать базовую Adapter

activity_main .xml: макет для MainActivity.java. Для этого демонстрационного приложения он будет содержать только ListView.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    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" 
    tools:context=".MainActivity"> 

    <ListView 
     android:id="@+id/lvCustomList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

layout_list_item.xml: Макет для элементов списка, которые будут отображаться в элементе управления ListView. В этом списке каждый элемент списка отобразит ImageView и два TextView.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" 
    android:padding="10dp"> 

    <ImageView 
     android:id="@+id/ivIcon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/star1" /> 

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

     <TextView 
      android:id="@+id/tvTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:text="Title" /> 

     <TextView 
      android:id="@+id/tvDesc" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="5dp" 
      android:text="Description" /> 
    </LinearLayout> 

</LinearLayout> 

Создание модели класса

ListData.java: Эта модель класс содержит два значения типа Строки для заголовка и описания. imgResId предназначен для отображения изображения в элементах списка.

package pcsalt.example.customlistviewdemo; 

/* 
* ListData class will hold data for displaying in ListView 
* */ 
public class ListData { 

     String Description; 
     String title; 
     int imgResId; 

     public String getDescription() { 
       return Description; 
     } 

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

     public String getTitle() { 
       return title; 
     } 

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

     public int getImgResId() { 
       return imgResId; 
     } 

     public void setImgResId(int imgResId) { 
       this.imgResId = imgResId; 
     } 

} 

Наследование BaseAdapter и модифицировать в соответствии с функциональностью MyBaseAdapter.java: Создание пользовательского BaseAdapter раздувать элементы ListView с макетом layout_list_item.xml.

package pcsalt.example.customlistviewdemo; 

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

import java.util.ArrayList; 

public class MyBaseAdapter extends BaseAdapter { 

    ArrayList myList = new ArrayList(); 
    LayoutInflater inflater; 
    Context context; 


    public MyBaseAdapter(Context context, ArrayList myList) { 
     this.myList = myList; 
     this.context = context; 
     inflater = LayoutInflater.from(this.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) { 
     MyViewHolder mViewHolder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.layout_list_item, parent, false); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

     ListData currentListData = getItem(position); 

     mViewHolder.tvTitle.setText(currentListData.getTitle()); 
     mViewHolder.tvDesc.setText(currentListData.getDescription()); 
     mViewHolder.ivIcon.setImageResource(currentListData.getImgResId()); 

     return convertView; 
    } 

    private class MyViewHolder { 
     TextView tvTitle, tvDesc; 
     ImageView ivIcon; 

     public MyViewHolder(View item) { 
      tvTitle = (TextView) item.findViewById(R.id.tvTitle); 
      tvDesc = (TextView) item.findViewById(R.id.tvDesc); 
      ivIcon = (ImageView) item.findViewById(R.id.ivIcon); 
     } 
    } 
} 



    if (convertView == null) { 
    convertView = inflater.inflate(R.layout.layout_list_item, parent, false); 
    mViewHolder = new MyViewHolder(convertView); 
    convertView.setTag(mViewHolder); 
} else { 
    mViewHolder = (MyViewHolder) convertView.getTag(); 
} 

В этом коде, мы проверяем, если convertView уже инициализирован или нет. Если нет, то раздуйте макет элемента списка, создайте объект ViewHolder и сохраните его в теге convertView. Если convertView уже инициализирован, то извлеките экземпляр ViewHolder из тега convertView. Это необходимо для повторного использования памяти, которая уже была создана для предыдущего элемента списка. Если это не сделано, то для каждого нового элемента, отображаемого в списке, будет создана его собственная память. И это может вызвать OutOfMemoryException. Populate BaseAdapter с данными заселить данные в BaseAdapter, мы пройдем список моделей класса от MainActivity.java

package pcsalt.example.customlistviewdemo; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends Activity { 

    ListView lvDetail; 
    Context context = MainActivity.this; 
    ArrayList myList = new ArrayList(); 

    String[] title = new String[]{ 
      "Title 1", "Title 2", "Title 3", "Title 4", 
      "Title 5", "Title 6", "Title 7", "Title 8" 
    }; 
    String[] desc = new String[]{ 
      "Desc 1", "Desc 2", "Desc 3", "Desc 4", 
      "Desc 5", "Desc 6", "Desc 7", "Desc 8" 
    }; 
    int[] img = new int[]{ 
      R.drawable.star1, R.drawable.star2, R.drawable.star3, R.drawable.star4, 
      R.drawable.star5, R.drawable.star6, R.drawable.star7, R.drawable.star8 
    }; 

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

     lvDetail = (ListView) findViewById(R.id.lvCustomList); 
     // insert data into the list before setting the adapter 
     // otherwise it will generate NullPointerException - Obviously 
     getDataInList(); 
     lvDetail.setAdapter(new MyBaseAdapter(context, myList)); 
    } 

    private void getDataInList() { 
     for (int i = 0; i &lt; title.length; i++) { 
      // Create a new object for each list item 
      ListData ld = new ListData(); 
      ld.setTitle(title[i]); 
      ld.setDescription(desc[i]); 
      ld.setImgResId(img[i]); 
      // Add this object into the ArrayList myList 
      myList.add(ld); 
     } 
    } 

} 

https://github.com/krrishnaaaa/CustomListViewDemo

Смежные вопросы