2015-04-16 204 views
0

今天我有一個問題,我想知道。 假設我有一個只顯示文本列表的列表視圖。 listview佈局是一個簡單的列表視圖,只包含一個Textview。更改列表視圖的佈局

現在,當我顯示結果,第一種觀點,我想表明的是與假設圖像(我認爲佈局應更改此處)一個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); 
     } 
+0

我想你可以用2型動物的部分獨特的佈局:擁有你想要的TextView的和任何和具有圖像文本的URL等,以及其他線性主LinearLayout中,當您將數據傳遞到您的你可能在你的模型類中有一個布爾值,表示如果是一個完整的行。當你現在在你的適配器中時,如果是一個完整的行,也可以設置你的線性可見性。 – JpCrow

回答

1

我會把這兩個imageViewtextView列表項目佈局內。然後,如果有圖像可用,我設置imageView.setVisibility(View.Visible)。如果沒有圖像,imageView.setVisibility(View.Gone)


這是下面舊代碼,它使用Cursor和一些棄用方法。您可以使用自己的方式更改適配器以使用Cursor,或者您可以使用ListArray來存儲ListView中的項目。檢查我如何在adapter內膨脹imageViewtextView

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作爲單獨的視圖和seaprately其餘:

+0

你能告訴我一個關於你的邏輯的例子嗎?謝謝 –

+0

你在listview的適配器裏面做這個。使用適配器與Viewholder的列表視圖,你可以通過使用谷歌搜索代碼。 –

+0

我可以把我舊的項目代碼後,我回家也許 –

0

上述要求可以用許多的基於你選擇的方式來實現。 將項目1中的所有項目傳遞給listview的適配器中的項目N. 將項目0充作單獨視圖並將其作爲標題添加到列表視圖中。

優點: (1)可以作爲單獨膨脹完全不同的觀點對項0和其餘部分。同時你可以充分利用listview的查看可重用性功能。 (2)如果您嘗試使用onItemClickListener確定點擊動作,請單擊標題以及列表項目可直接在單個點上接收。

缺點: (1)通過這種方式,您可以僅在頂部或底部有效地添加突出顯示的視圖,但如果未來需求發生變化,則無法在中間添加。

2)可以使用在模型中類的唯一標識符用於檢測哪個對象需要在高亮的/不同的視圖中示出。然後在您的適配器中,您可以使用2個獨立的佈局來突出顯示不突出顯示的不同項目。

優點: (1)隨着時間的推移,你可以在列表中不僅在第0項的任意位置添加突出顯示的項目。 (1)您不能在getView()中通過ViewHolder使用視圖可重用特性,並且需要根據決策邏輯每次膨脹不同的視圖。

我建議你現在就用方法1,如果將來需求改變,就切換到方法2。

+0

你好,我需要使用getView函數來做到這一點?我是Android新手。對不起,如果我聽起來啞巴 –

+0

您需要通過擴展BaseAdapter或ArrayAdapter並重寫getView()方法來創建自定義適配器。接下來,您需要創建一個適配器對象並將其傳遞給ListView。它是在這個getView方法中,您可以根據決策邏輯對listView佈局進行充氣並裝飾視圖。 –

+0

但我使用簡單的適配器,而不是基座或陣列適配器 –

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; 
      }