Верхний и нижний колонтитулы в адаптере ListView

#android #header #android-listview

#Android #заголовок #android-listview

Вопрос:

 try {           
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
      sb.append(line);
    }
    is.close();
    resultString = sb.toString();
    String[] ArrayStr = Func.split(resultString, "|*|");
    String[] arr;

    lv = new ListView(context);
    lv.setAdapter(null);        
    // populate
    ArrayList<Device> m_Devices = new ArrayList<Device>();
    Device device;
    for(int i = 0; i < ArrayStr.length; i  ){
        arr = Func.split(ArrayStr[i], "|**|");
        device = new Device(arr[1], Integer.parseInt(arr[0]));
        m_Devices.add(device);
    }
    //  header n footer (must above custom adapter)

    View v1 = getLayoutInflater().inflate(R.layout.header, null);
    lv.addHeaderView(v1);


    View v = getLayoutInflater().inflate(R.layout.footer, null);
    lv.addFooterView(v);



    // custom adapter
    CustomAdapter lvAdapter =  new CustomAdapter(context, m_Devices);
    lv.setAdapter(lvAdapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
    @Override

    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    AlertDialog.Builder adb=new AlertDialog.Builder(Menu1.this);
    adb.setTitle("LVSelectedItemExample");
    adb.setMessage("Selected Item is = " lv.getItemAtPosition(position));
    adb.setPositiveButton("Ok", null);
    adb.show();
    }

    });
  

Как сделать так, чтобы верхний и нижний колонтитулы стали статичными?
верхний и нижний колонтитулы также становятся прокручиваемыми, как и в представлении списка..
у меня был Google n, кто-то предложил 4 разместить верхний и нижний колонтитулы за пределами listview, но я не знаю, куда их поместить? я уже пытаюсь поместить его в свой пользовательский адаптер, но ничего хорошего… итак, плз, кто-нибудь может сказать мне, как исправить эту проблему?

Комментарии:

1. Взгляните на нижний колонтитул и верхний колонтитул

2. Что касается липкого верхнего и нижнего колонтитулов, загляните в этот полезный блог

3. @adil я знаю, как размещать верхний и нижний колонтитулы при использовании xml. но когда я использовал пользовательский адаптер, я не могу использовать xml, но должен в файле java . спасибо

Ответ №1:

Я думаю, что размещение их за пределами ListView означает, что вы должны использовать пользовательские элементы просмотра, например TextViews, которые вы размещаете над и под ListView. Эти элементы больше не имеют ничего общего с ListView. Таким образом, вы больше не можете получить к ним доступ с помощью lv.addHeaderView(v1); или lv.addFooterView(v); . Вместо этого вы должны обращаться с ними как с обычными элементами TextView. Конечно, вы также можете использовать пользовательские представления вместо TextViews.

Обновить

Макет для вашей активности должен выглядеть примерно так. Первым TextView является верхний колонтитул, за которым следует ListView, а под ним мы получаем еще один TextView в качестве нижнего колонтитула. Верхний и нижний колонтитулы не нуждаются в TextViews, они могут быть любым видом представления.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView android:id="@ id/header_txt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Footer Text"/>
    <ListView android:id="@ id/listView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <TextView android:id="@ id/footer_txt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Footer Text"/>
</LinearLayout>
  

Таким образом, вы привяжете адаптер к ListView, как вы уже сделали. Чтобы задать текст для верхнего и нижнего колонтитулов, вы используете следующие строки.

 TextView header = (TextView) findViewById(R.id.header_text);
header.setText("This is my header text");
TextView footer = (TextView) findViewById(R.id.footer_text);
footer.setText("This is my footer text");
  

Комментарии:

1. @flo можете ли вы привести мне пример формата? потому что я уже перепробовал так много возможных вариантов, но никто не устранил мою проблему … спасибо 4 помощнику ur 🙂

2. @Flo куда я должен поместить этот код? я создаю другой LinearLayout LL = new LinearLayout(контекст); LL.addView(заголовок); LL.addView(lv); LL.addView (нижний колонтитул); setContainer (LL); я думаю, что логика верна, но все еще ошибка …. этот listview действительно действительно что-то

3. Извините, возникли некоторые проблемы с форматированием моего ответа, поэтому размещенный мной XML-макет не был показан. Mh какую ошибку вы получаете? Можете ли вы добавить свой текущий код к вашему первоначальному вопросу, а также добавить ошибку из журнала cat?

4. @Flo о, теперь я вижу, что вы используете XML, у меня есть 2 варианта.. в этом случае я не могу использовать статический заголовок, потому что я не использую XML для setcontentview, но его можно щелкнуть… в другом варианте я использую XML, подобный вашему, он хорош, но его нельзя щелкнуть… меня это расстраивает … если вы в моем состоянии, какую ведьму вы используете?

5. Что вы имеете в виду под «Невозможно щелкнуть»? Вы можете привязать OnClickListener к представлению верхнего и нижнего колонтитулов в вашем коде, хотя вы используете xml-макеты. Но, конечно, вы также можете создать макет с помощью кода. Вам просто не следует использовать методы addHeaderView() и addFooterView(), поскольку они всегда будут прокручиваться вместе со списком.