2015-04-16 2 views
0

сегодня у меня есть вопрос, о котором мне было интересно. Предположим, что у меня есть listview, который показывает только список текста. Макет списка представляет собой простой вид списка, содержащий только текстовое представление.Изменить раскладку Listview

Теперь, когда я показываю результат, первое представление, которое я хочу показать, - это текстовое изображение, скажем, изображение (я думаю, что макет должен измениться здесь). После этого он покажет обычный текст. Вы видите, что в таких приложениях, как новости, они показывают первые новости с большими картинками и текстом, а остальная часть списка - только с текстами. Можете ли вы дать мне некоторое представление об этом? или мне нужно сделать это отдельно?

спасибо. мой простой adapter->

@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 Дифференц секций: основной LinearLayout, который имеет TextView и все, что вы хотите, и другие линейное, который имеет изображение текст URLs и т.д. И когда вы передаете данные на ваш адаптер, который может иметь в вашем классе модели логическое значение, указывающее, является ли полная строка или нет. Также setVisibility для видимых вашим линейным, когда вы сейчас находитесь в своем адаптере, если это полная строка или нет. – JpCrow

ответ

1

я бы поставил как imageView и textView внутри макета списка. Затем, если есть изображение, я устанавливаю imageView.setVisibility(View.Visible). Если изображение отсутствует, imageView.setVisibility(View.Gone).


Это старый код ниже, который использует Cursor и некоторые устаревшие методы. Вы можете изменить свой адаптер, чтобы использовать Cursor по-своему, или вы можете использовать List, Array для хранения предметов внутри ListView. Проверьте, как я надуваю imageView и textView внутри adapter.

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

Этот код может не работать должным образом, но он дает идею.

+0

Можете ли вы показать мне пример фрагмента вашей логики? Спасибо –

+0

, вы делаете это внутри адаптера списка. Используйте адаптер с Viewholder для просмотра списка, вы можете найти коды по googling. –

+0

Я могу поместить код из моего старого проекта после того, как я вернусь домой, возможно, –

0

Приведенные выше требования могут быть выполнены различными способами на основе вашего выбора:

1) Рассмотрим пункт 0 в отдельном окне, а остальные seaprately. Передайте все элементы из пункта 1 в пункт N в адаптер списка. Пока раздуйте элемент 0 как отдельный вид и добавьте его в виде заголовка для просмотра списка.

Плюсы: (1) Вы можете раздуть совершенно разные виды для предмета 0, а остальное как отдельно. В то же время вы можете в полной мере воспользоваться функцией повторного использования вида listview. (2) Если вы попытаетесь использовать onItemClickListener для определения действия щелчка, нажмите Header, а также элементы списка могут быть получены в одной точке напрямую.

Против: (1) Таким образом, вы можете добавлять выделенные виды только сверху или снизу эффективно, но нигде в середине, если в будущем будут меняться требования.

2) Вы можете использовать уникальный идентификатор в классе модели, который используется для определения того, какой объект должен отображаться в выделенном/другом виде. Затем в вашем адаптере вы можете использовать раздувание 2 отдельных макетов для выделенных и не выделенных элементов.

Плюсы: (1) С течением времени вы можете добавлять выделенные элементы в любом месте списка не только на 0-й элемент.

Против: (1) Вы не можете использовать функцию повторного использования вида через ViewHolder в getView() и каждый раз надуть разные виды на основе логики принятия решений.

Я бы рекомендовал вам пойти с методом 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; 
      } 
Смежные вопросы