2012-02-22 29 views
0

我需要创建一个类似于ff的项目。 PIC。 (我对使用siily pic表示歉意,我不得不使用随时可用的软件)。
enter image description here多行ListView w/ImageView左侧


我不会说什么,我所做的是在做一个“动态”的ListView最好的办法,但我很高兴只是为了做什么我现在有工作。反正我的实现如下:

public class MultiLineListViewActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ArrayList<SearchResults> searchResults = getSearchResults(); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(new MyCustomBaseAdapter(this, searchResults)); 
} 

private ArrayList<SearchResults> getSearchResults() { 
    ArrayList<SearchResults> results = new ArrayList<SearchResults>(); 

    SearchResults sr1 = new SearchResults(); 
    sr1.setName("Name 1"); 
    sr1.setPhone("12345"); 
    SearchResults.setIcon(R.drawable.pic_one); 
    results.add(sr1); 

    sr1 = new SearchResults(); 
    sr1.setName("Name 2"); 
    sr1.setPhone("123456"); 
    SearchResults.setIcon(R.drawable.pic_two); 
    results.add(sr1); 

    ... 

    return results; 
} 
} 


公共类SearchResult所{

private String name; 
private String phone; 
public static ArrayList<Integer> iconsList = new ArrayList<Integer>(); 

public void setName(String name) { 
    this.name = name; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public static void setIcon(int i) { 
    iconsList.add(i); 
} 

public String getName() { 
    return this.name; 
} 

public String getPhone() { 
    return this.phone; 
} 
} 


public class MyCustomBaseAdapter extends BaseAdapter { 

private ArrayList<SearchResults> searchArrayList; 
private LayoutInflater layoutInflater; 
private Context context; 

public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) { 
    this.searchArrayList = results; 
    //this.context = context; 
    layoutInflater = LayoutInflater.from(context); 
} 

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

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    ImageView imageView; 

    if(convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.custom_row_view, null); 

     holder = new ViewHolder(); 
     holder.txtName = (TextView) convertView.findViewById(R.id.name); 
     holder.txtPhone = (TextView) convertView.findViewById(R.id.phone); 

     imageView = new ImageView(context); 

     convertView.setTag(holder); 
    } 
    else { 
     //imageView = (ImageView) convertView; 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    imageView = new ImageView(context); 
    imageView.setImageResource(SearchResults.iconsList.get(position)); 

    holder.txtName.setText(searchArrayList.get(position).getName()); 
    holder.txtPhone.setText(searchArrayList.get(position).getPhone()); 

    return convertView; 
} 

class ViewHolder { 
    TextView txtName; 
    TextView txtPhone; 
} 


上面的代码是成功的在显示名称电话在ListView中的行,它是给我'逼近'的图像的添加。

注意注释行imageView =(ImageView)convertView; 我已经减少到特定的行,因为删除评论导致应用程序崩溃。

回答

3

注意:每当你在StackOverflow问题中得到一个关于力的问题时,请发布完整的堆栈跟踪。

你总是创建一个新的ImageView其实你可能根本不需要创建一个新的。它应该在你的自定义项目布局中定义(你应该在这种情况下发布),就像TextView一样。你可以用相同的方式使用findViewById并获得它。

+0

你的建议是当场!就像你说过我已经添加了一个ImageView到layout.custom_row_view.xml,在getView()中删除了所有imageView的声明和实例化,嵌套LinearLayouts(RelativeLayout也可以)排列类似于示例的视图..和中提琴!它现在按预期工作,谢谢! – 2012-02-23 10:19:44

3

kabuko在这两方面都是正确的。 (更新:下面他的评论也不应该被忽略。)我猜你的layout/custom_row_view是一个LinearLayout,这意味着注释行尝试将一个LinearLayout强制转换为一个ImageView,这会引发异常。此外,您ViewHolder类是多余的,只是定义这些TextViews作为变量在getView()是这样的...

// Assuming that layout/custom_row_view is a LinearLayout... 
getView(yadda) { 
    LinearLayout row; 
    ImageView imageView; 
    TextView txtName, txtPhone; 

    if (convertView == null) { 
     row = // inflate a new one 
    } else { 
     row = // get the old one 
    } 

    // fetch the views 
    imageView = row.findViewById(...); 
    txtName = row.findViewById(...); 
    txtPhone = row.findViewById(...); 

    // fill the views 
    imageView.setImageResource(...); 
    txtName.setContent(...); 
    txtPhone.setContent(...); 

    return row; 
} 

的Ciao。

+1

'ViewHolder'类实际上是一个有效的性能增强。 'findViewById'并不总是便宜的,有时候为了节省处理时间而花费更多的内存是值得的。有关示例,请参见[this](http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html)。 – kabuko 2012-02-22 21:08:23