2014-12-30 21 views
0

如何修改下面的代碼以便每個項目都有兩行而不是一行?我希望mSample部分中的代碼與我發佈的佈局相同,因此請不要不恰當地修改它,除非有必要。下面是一張圖片,描繪了一行的列表。ListView - 將項目從1更改爲2行

我知道單擊事件和列表適配器代碼需要更改,但我不知道該怎麼做。

我也有一個名爲的xml,list_item_entry.xml包含兩個文本視圖(比另一個大一個),但我不確定是否需要使用它。

list view

package com.example.android.animationsdemo; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

/** 
* The launchpad activity for this sample project. This activity launches other activities that 
* demonstrate implementations of common animations. 
*/ 
public class MainActivity extends ListActivity { 
    /** 
    * This class describes an individual sample (the sample title, and the activity class that 
    * demonstrates this sample). 
    */ 
    private class Sample { 
     private CharSequence title; 
     private Class<? extends Activity> activityClass; 

     public Sample(int titleResId, Class<? extends Activity> activityClass) { 
      this.activityClass = activityClass; 
      this.title = getResources().getString(titleResId); 
     } 

     @Override 
     public String toString() { 
      return title.toString(); 
     } 
    } 

    /** 
    * The collection of all samples in the app. This gets instantiated in {@link 
    * #onCreate(android.os.Bundle)} because the {@link Sample} constructor needs access to {@link 
    * android.content.res.Resources}. 
    */ 
    private static Sample[] mSamples; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Instantiate the list of samples. 
     mSamples = new Sample[]{ 
       new Sample(R.string.title_crossfade, CrossfadeActivity.class), 
       new Sample(R.string.title_card_flip, CardFlipActivity.class), 
       new Sample(R.string.title_screen_slide, ScreenSlideActivity.class), 
       new Sample(R.string.title_zoom, ZoomActivity.class), 
       new Sample(R.string.title_layout_changes, LayoutChangesActivity.class), 
     }; 

     setListAdapter(new ArrayAdapter<Sample>(this, 
       android.R.layout.simple_list_item_1, 
       android.R.id.text1, 
       mSamples)); 
    } 

    @Override 
    protected void onListItemClick(ListView listView, View view, int position, long id) { 
     // Launch the sample associated with this list position. 
     startActivity(new Intent(MainActivity.this, mSamples[position].activityClass)); 
    } 

} 

list_item_entry.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:gravity="center_vertical" 
    android:paddingRight="?android:attr/scrollbarSize" 
    android:baselineAligned="false"> 

    <RelativeLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:layout_marginRight="6dip" 
     android:layout_marginTop="6dip" 
     android:layout_marginBottom="6dip" 
     android:layout_weight="1"> 

     <TextView android:id="@+id/list_item_entry_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:ellipsize="marquee" 
      android:fadingEdge="horizontal" 
      /> 

     <TextView android:id="@+id/list_item_entry_summary" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/list_item_entry_title" 
      android:layout_alignLeft="@id/list_item_entry_title" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:singleLine="true" 
      android:textColor="?android:attr/textColorSecondary" 
      /> 

    </RelativeLayout> 

</LinearLayout> 

類錯誤

enter image description here enter image description here

package com.example.android.animationsdemo; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

/** 
* The launchpad activity for this sample project. This activity launches other activities that 
* demonstrate implementations of common animations. 
*/ 
public class MainActivity extends ListActivity { 
    /** 
    * This class describes an individual sample (the sample title, and the activity class that 
    * demonstrates this sample). 
    */ 
    private class Sample { 
     private CharSequence title; 
     private CharSequence summary; 
     private Class<? extends Activity> activityClass; 

     public Sample(int titleResId, int summaryResId, Class<? extends Activity> activityClass) { 
      this.activityClass = activityClass; 
      this.title = getResources().getString(titleResId); 
      this.summary = getResources().getString(summaryResId); 

     } 

     @Override 
     public String toString() { return title.toString(); return summary.toString(); } 
    } 

    /** 
    * The collection of all samples in the app. This gets instantiated in {@link 
    * #onCreate(android.os.Bundle)} because the {@link Sample} constructor needs access to {@link 
    * android.content.res.Resources}. 
    */ 
    private static Sample[] mSamples; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Instantiate the list of samples. 
     mSamples = new Sample[]{ 
       new Sample(R.string.title_crossfade, R.string.summary_crossfade, CrossfadeActivity.class), 
       new Sample(R.string.title_card_flip, R.string.summary_card_flip, CardFlipActivity.class), 
       new Sample(R.string.title_screen_slide, R.string.summary_screen_slide, ScreenSlideActivity.class), 
       new Sample(R.string.title_zoom, R.string.summary_zoom, ZoomActivity.class), 
       new Sample(R.string.title_layout_changes, R.string.summary_layout_changes, LayoutChangesActivity.class), 
     }; 
    } 

    @Override 
    protected void onListItemClick(ListView listView, View view, int position, long id) { 
     // Launch the sample associated with this list position. 
     startActivity(new Intent(MainActivity.this, mSamples[position].activityClass)); 
    } 

    static class MyAdapter extends BaseAdapter { 

     static class ViewHolder { 
      TextView title; 
      TextView summary; 
     } 

     LayoutInflater inflater; 
     Sample[] mSamples; 

     public MyAdapter(Context contexts, Sample[] samples) { 
      this.mSamples = samples; 
      inflater = LayoutInflater.from(contexts); 

     } 

     @Override 
     public int getCount() { 
      return mSamples.length; 
     } 

     @Override 
     public Object getItem(int position) { 
      return mSamples[position]; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder viewHolder; 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.entry, null); 
       viewHolder = new ViewHolder(); 

       viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_entry_title); 
       viewHolder.summary = (TextView) convertView.findViewById(R.id.list_item_entry_summary); 
       convertView.setTag(viewHolder); 
      } else { 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 
      viewHolder.title.setText(mSamples[position].title); 
      viewHolder.summary.setText(mSamples[position].summary); 
      return convertView; 
     } 
    } 
} 

回答

1

也許它會幫助你

public class MainActivity extends ListActivity { 

    /* 
    current code 
    */ 

    public void onCreate(Bundle savedInstanceState) { 
    // 
    // 

     setListAdapter(new SampleAdapter(this, 
      android.R.layout.simple_list_item_1, 
      mSamples)); 
    } 

    @Override 
    protected void onListItemClick(ListView listView, View view, int position, long id) { 
     // Launch the sample associated with this list position. 
     startActivity(new Intent(MainActivity.this, mSamples[position].activityClass)); 
    } 

    public static class SampleAdapter extends ArrayAdapter<Sample>{ 

      SampleAdapter(Context context, int resource, Sample[] objects) { 
       super(context, resource, objects); 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View rootView = super.getView(position, convertView, parent); 
       TextView firstLine = rootView.findViewById(R.id.list_item_entry_title); 
       TextView secondLine = rootView.findViewById(R.id.list_item_entry_summary); 
       firstLine.setText(getItem(position)./*Sample class field*/); 
       secondLine.setText(getItem(position)./*Sample class field*/); 
       return rootView; 
      } 
     } 
} 
+0

哪裏這個類需要去? – MacaronLover

+0

它可以是你的活動的一個子類 – SorryForMyEnglish

+0

它是否需要在我的活動相同的java文件? – MacaronLover

0

如果你想與一個以上的TextView定製行,那麼你應該實現自己的適配器。您發佈的XML毫無用處,因爲您正在使用android.R.layout.simple_list_item_1android.R.id.text1。爲了達到你想要做什麼,試試這個:

public class MyAdapter extends BaseAdapter { 

    static class ViewHolder { 
     TextView title; 
     TextView summary; 
    } 

    LayoutInflater inflater; 
    Sample[] mSamples; 

    public MyAdapter(Context contexts, Sample[] samples) { 
     this.mSamples = samples; 
     inflater = LayoutInflater.from(contexts); 

    } 

    @Override 
    public int getCount() { 
     return mSamples.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return mSamples[position]; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.entry, null); 
      viewHolder = new ViewHolder(); 

      viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_entry_title); 
      viewHolder.summary = (TextView) convertView.findViewById(R.id.list_item_entry_summary); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.title.setText(mSamples[position].title); 
     viewHolder.summary.setText(mSamples[position].summary); 
     return convertView; 
    } 
} 

而且你可以使用它像這樣:

list.setAdapter(new MyAdapter(this, samples)); 
+0

我打算使用大量的項目50+,所以我寧願有一個更有效的方法來做到這一點。 – MacaronLover

+0

那麼你需要在getView中實現ViewHolder模式,它遍佈互聯網。 – Nasir

+0

我的物品代碼 - 它們怎麼樣? – MacaronLover