更改Listview的布局

时间:2015-04-16 19:23:44

标签: android listview android-listview

今天我有一个我想知道的问题。 让我们说我有一个列表视图,它只显示一个文本列表。 listview布局是一个只包含Textview的简单列表视图。

现在,当我显示结果时,第一个视图,我要显示的是一个文本视图,让我们说图像(我认为布局应该在这里改变)。之后,它将显示常规textview。 你会看到,在新闻等应用中,他们会显示带有大图片和文字的第一个新闻,而列表的其余部分只显示文本。 你能给我一些想法吗?或者我必须分开吗?

谢谢。 我的简单适配器 - >

@Override
        public void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();

             // Updating parsed JSON data into ListView

            ListAdapter adapter = new SimpleAdapter(getActivity(), postList, R.layout.list_item,
                    new String[] { POST_TITLE,POST_CONTENT, GUID },
                    new int[] {R.id.email, R.id.mobile, R.id.guid });

            newsList.setAdapter(adapter);
        }

3 个答案:

答案 0 :(得分:1)

我会将imageViewtextView放在列表项布局中。然后,如果有可用的图像,我设置imageView.setVisibility(View.Visible)。如果没有图片imageView.setVisibility(View.Gone)


这是下面的旧代码,它使用Cursor和一些弃用的方法。您可以使用自己的方式更改适配器以使用Cursor,也可以使用ListArray将项目存储在ListView中。检查我如何在imageView内充气textViewadapter

public class Home_fragment extends Fragment{
ChannelAdapter adapter;
private ListView mListView;
Cursor cursor;
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    ...
    View view = inflater.inflate(R.layout.home_fragment, null);
    mListView = (ListView) view.findViewById(R.id.list);
    cursor = ((CounterPP) getActivity().getApplication()).addList.query(); 
    getActivity().startManagingCursor(cursor);
    adapter = new ChannelAdapter(getActivity(), R.layout.list_item, cursor, FROM, TO);
    mListView.setAdapter(adapter);
    ....
}

static class ViewHolderItem {       
        TextView textHere;
        ImageView imageHere;
}

// You can extend ArrayAdapter for your own adapter implementation
public class ChannelAdapter extends SimpleCursorAdapter {
    ...
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final  ViewHolderItem viewHolder;
        if(convertView==null){
            LayoutInflater inflater =(LayoutInflater)getActivity().getApplicationContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            //R.layout.list_item xml has imageView and textView
            convertView = inflater.inflate(R.layout.list_item, parent, false);

            viewHolder = new ViewHolderItem();         
            viewHolder.textHere = (TextView) convertView.findViewById(R.id.textNew);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageNew);

            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolderItem) convertView.getTag();
        }

        if(you have image to show){
            viewHolder.imageHere.setVisible(View.VISIBLE);
            viewHolder.textHere.setText("Text From your List");
            viewHolder.imageHere.setDrawable(your image here);
        }else{
            viewHolder.imageHere.setVisible(View.GONE);
            viewHolder.textHere.setText("Text From your List");       
        }
        return convertView;
    } 

此代码可能无法正常运行,但它提供了这个想法。

答案 1 :(得分:0)

以上要求可以根据您的选择以多种方式实现:

1)将项目0视为单独的视图,其余视图为seaprately。 将所有项目从项目1传递到listview适配器中的项目N. 将项目0作为单独的视图膨胀,并将其添加为列表视图的标题。

优点: (1)您可以单独为项目0和其余视图完全填充不同的视图。同时您可以充分利用listview的视图可重用性功能。 (2)如果您尝试使用onItemClickListener来确定单击操作,请单击Header以及可以直接在单个点接收列表项。

缺点: (1)通过这种方式,您可以有效地仅在顶部或底部添加突出显示的视图,但如果需求在将来发生变化,则无处在中间。

2)您可以在模型类中使用唯一标识符来检测需要在突出显示/不同视图中显示的对象。然后在适配器中,您可以为突出显示和未突出显示的不同项目使用2个单独的布局。

优点: (1)随着时间的推移,您可以在列表中的任何位置添加突出显示的项目,而不仅仅是第0项。

缺点: (1)您无法在getView()中通过ViewHolder使用视图可重用性功能,并且每次都需要根据决策逻辑对不同的视图进行扩充。

我建议您现在使用方法1,如果将来需求发生变化,请切换到方法2。

答案 2 :(得分:0)

我做了这样的事情。看看吧!

public View getView(int position, View convertView, ViewGroup Parent){
                if(convertView == null){
                    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.list_item,null);

                }
                TextView thisview = (TextView) convertView.findViewById(R.id.email);
                int getListPos = newsList.getFirstVisiblePosition();
                //i set the count starting 0 and saved in the hashmap array 
                //to compare the first result with the first position of listview
                int count = Integer.parseInt(objects.get(position).get("ListCount"));

                if(getListPos == count) {
                    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.list_item_header,null);
                    TextView HeaderText = (TextView) convertView.findViewById(R.id.headertext);
                    TextView HeaderContent = (TextView) convertView.findViewById(R.id.headercontent);
                    HeaderText.setText(objects.get(position).get(POST_TITLE));
                    HeaderContent.setText(objects.get(position).get(POST_CONTENT));

                }else{
                    thisview.setText("Normal line");
                }

                return convertView;
            }