ListView & Custom ListView - PullRequest
       10

ListView & Custom ListView

2 голосов
/ 25 апреля 2011

Мне нужна помощь о том, как изменить мой код ниже, чтобы использовать мое собственное представление списка XML. Элементы «label», «title» и «discription» в моем курсоре должны быть накачаны на itemLabel, itemTitle и itemDiscription для xml. Любая помощь будет оценена: я знаю, как сделать это из простого массива. Работа, которую я создал, чтобы получить данные из базы данных, прекрасно работает - я просто не знаю, как использовать / отображать пользовательский lisView с мультилинией. Thnx!

ПЕРЕСМОТРЕНО: мне удалось получить данные для отображения из базы данных, используя мой собственный XML-файл. У меня сейчас проблема - все три столбца возвращаются в каждом TextView. То есть: столбцы 'title', 'label', 'description' из БД все раздуваются в один TextView в виде одной непрерывной строки. Я не могу понять, как разбить его на правильные TextViews; title = R.id.listTitle, label = R.id.label, а описание должно увеличиваться в R.id.caption. Помогите!

Действия ListView: (ПЕРЕСМОТРЕНО):

public class List_AC extends ListActivity {

private ArrayList<String> results = new ArrayList<String>();

File dbfile = new File("/mnt/sdcard/XXX/XXX/dB/XXX.db");
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    openAndQueryDatabase();
    displayResultList();
}

private void displayResultList() {
    AC_Adapter adapter = new AC_Adapter(getApplicationContext(),R.layout.list_item, results, results, results);
    setListAdapter(adapter);
}

private void openAndQueryDatabase() {
    try {
        Cursor c = db.rawQuery("SELECT label, title, discription FROM AC_list", null);
        if (c != null) {
            if (c.moveToFirst()) {
                do {
                    String i1 = c.getString(c.getColumnIndex("label"));
                    String i2 = c.getString(c.getColumnIndex("title"));
                    String i3 = c.getString(c.getColumnIndex("discription"));
                    results.add(i1 + i2 + i3);
                } while (c.moveToNext());
            }
        }
    } catch (SQLiteException se) {
        Log.e(getClass().getSimpleName(),
                "Could not create or Open the database");
    } finally {
        if (db != null)
            db.close();
    }
}

}

ДОБАВЛЕННЫЙ АДАПТЕР (AC_Adapter.java):

public class AC_Adapter extends ArrayAdapter<String> {
static List<String> Title = new ArrayList<String>();
static List<String> Label = new ArrayList<String>();
static List<String> Description = new ArrayList<String>();

Context myContext;

public AC_Adapter (Context context, int resource, List<String> aTitle, List<String> aLabel, List<String> aDescription){

    super(context, resource, aTitle);

    myContext = context;
    Title= aTitle;
    Label= aLabel;
    Description = aDescription;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) myContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_item, null);
    }

    TextView tv_label = (TextView) v.findViewById(R.id.label);
    TextView tv_title = (TextView) v.findViewById(R.id.listTitle);
    TextView tv_decription = (TextView) v.findViewById(R.id.caption);

    if (tv_label != null) {
        tv_label.setText(Label.get(position));
    }
    if (tv_title != null) {
        tv_title.setText(Title.get(position));
    }
    if (tv_decription != null) {
        tv_decription.setText(Description.get(position));
    }

    return v;

}

}

Это XML, который необходимо создать (list_view.xml) в onCreate:

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

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="30dip" 
    android:padding="4dip"
    android:background="@drawable/gradient" >

    <ImageButton
        android:id="@+id/homeBtn"
        android:src="@drawable/ic_menu_icon"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:background="@null" />

    <TextView
        android:id="@+id/titleBarTitle"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:textSize="18sp" />

    <ImageButton
        android:id="@+id/toolBtn"
        android:src="@drawable/ic_menu_list"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="@null" />

 </RelativeLayout>

<ListView 
   android:id="@+id/listItems" 
   android:layout_height="wrap_content"
   android:layout_width="fill_parent" />

</LinearLayout>

и элемент списка (list_item.xml):

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/itemLabel"
    style="@style/listAcronym" />

<TextView
    android:id="@+id/itemTitle"
    style="@style/listTitle" />

<TextView
    android:id="@+id/itemDiscription"
    style="@style/listDiscription"/>        

<ImageView
    style="@style/listNextIcon" />   

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Все хорошо, просто добавьте класс, расширяемый из ArrayAdapter, и сделайте что-то вроде этого:

public class CustomAdapter extends ArrayAdapter<String>
{
    List<String> Title= new ArrayList<String>();
    List<String> Label= new ArrayList<String>();


    Context myContext;


public CustomAdapter (Context context, int resource,
                                               int textviewresourceid,  
                                               List<String> aTitle,
                                               List<String> aLabel)
{


    super(context, resource,textviewresourceid,aType);

    myContext = context;
    Title= aTitle;
    Label= aLabel;



}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if (v == null) 
    {
            LayoutInflater vi = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_view, null);
    }

    TextView tv_title = (TextView) v.findViewById(R.id.id_tv_Title);
    TextView tv_Label= (TextView) v.findViewById(R.id.id_tv_Label);


    if(tv_title != null)
    {
        tv_title.setText(Title.get(position));
    }
    if(tv_Label != null)
    {
        tv_Label.setText(Label.get(position));
    }

    return v;


}

А затем используйте этот адаптер как:

CustomAdapter adapter = new CustomAdapter(getAppContext(),R.layout.list_view,Textview Title Id,your lists...);

setListAdapter(adapter);

Что-то вроде этого .... надеюсь, это поможет ...

2 голосов
/ 25 апреля 2011

Основной процесс заключается в создании пользовательского адаптера, который будет содержать макет R.layout.list_item

Таким образом, вы замените эту строку setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, results)); в своем коде на

setListAdapter(new CustomAdapter(this,R.layout.list_item, results));

Теперь вам нужно создать CustomAdapter, который расширяет ArrayAdapter или BaseAdapter и переопределить метод getView для надувания R.layout.list_item

Пожалуйста, обратитесь к этому превосходному учебнику Марка Мерфи Настраиваемый адаптер ListView

Если у вас возникли какие-либо сомнения после этого, пожалуйста, опубликуйте их здесь.

0 голосов
/ 30 апреля 2011

У меня правильный ответ ЗДЕСЬ вместе с правильным кодом.

...